写点什么

专访雪球网技术团队:用 Node.js 做前端的类 SOA 架构

  • 2012-04-08
  • 本文字数:3174 字

    阅读完需:约 10 分钟

雪球网( xueqiu.com ),是一家股票信息网站,给投资者提供跨市场、跨品种的数据查询、新闻订阅和互动交流服务,目前覆盖 A 股、港股、美股市场。 不久前,InfoQ 中文站通过电子邮件对雪球网的技术团队进行了专访,以下是访谈内容。

InfoQ:请各位简单介绍下自己的技术经历和现在在雪球网承担的技术工作职责?

雪球网:王栋( @蘑菇树),从最早的 ASP 时代开始做电子商务网站,到后来用 Java 做企业系统,然后创业做互联网失败进入外企,后整个中国部门被裁员,最终重新回到国内的创业互联网公司。除了早期在微软平台下的一年,后来的开发就一直集中在 Linux 和 Java 的平台,也有使用过 Ruby On Rails / PHP 的经验,还做过 Android 相关的一些移动产品。现在雪球负责整个技术团队的各项工作。

钟广凯( @gkzhong ),以前在网易担任技术组长,主要负责财经相关系统开发工作,曾负责网易微博架构设计,主要专注于高性能和分布式存储方向。在雪球负责系统架构设计和核心代码开发。

孟祥宇( @蒙懵猛孟),毕业之后在一家公司做 Drupal 相关的开发工作,php 和前端都写过一些。2011 年初来到雪球做前端工程师,现在负责雪球的前端架构。

InfoQ能否介绍下现在雪球网的技术团队构成?

雪球网:雪球的技术团队不算很大,有十多个人,大概可以按照职责分为前端、后端、架构三种角色。

  • 前端:负责所有和用户有交互的产品,包括 WEB 以及手机客户端
  • 后端:负责各种业务 API 的开发,以及服务器端其他系统的开发
  • 架构:负责设计实现关键系统的架构,服务器维护以及开发过程管理,团队建设

InfoQ能否说明一下雪球网的技术和架构发展过程?

雪球网:最早的雪球是以 imeigu.com 的一个子项目存在的,当时没有足够的技术人员,所以采用了外包的方式进行第一个版本的开发,我们当时有一名架构师进行系统的功能设计以及验收。当时的架构是基于 Spring 的一种典型 MVC 架构:展现层使用 JSP,控制层使用 Spring,Model 层使用自己开发的一个基于 SQL 的映射框架,在需要使用缓存的地方采用了内嵌 BDB 的方式。后来因为业务量的增大,我们决定使用多 WEB 实例进行分流,这时就不能再使用内嵌 BDB 的方式了,我们直接选择 Redis 作为我们的中心缓存系统。这时 1.0 版本已经基本完成。

2.0 版本的开发,决定增加对手机客户端的支持,但又不希望单独于 JSP 又做出一套逻辑来,另外正好我们的前端架构师孟祥宇对 Node.js 有一些了解,并且觉得很适合(具体原因参考下边的回答),所以我们决定把展现层单独剥离出来用 Node.js 实现,而后端只提供标准的 API 接口,这样不管是 WEB 还是手机客户端就可以使用同样的接口进行开发。去年 11 月,2.0 版本上线的时候,我们已经完全实现了这个目标。

目前我们正在进行 3.0 的开发,这个阶段的目标是整合、统一分散的 API,抽象出一些公用性的基础性的模块和系统形成独立的技术产品(中间件)满足未来大访问量、扩展的需要。

InfoQ对于雪球网自己特定的业务,处理起来最大的技术难点是什么? 这些难点是怎么克服的?

雪球网:我们的产品是基于 Follow 关系的交流平台,所以用户关注的信息分发一定是最重要的需要处理的问题,既需要即时的分发到关注的用户,也需要考虑到系统容量的限制。因为这几年类似系统的普及,以及大量的社区分享,使得我们实现这样的系统难度大大降低了。

实现上我们使用 Redis 作为我们的缓存服务器,采用以缓存为中心推拉结合的方法来更新用户的 Timeline,具体的做法是:当一个用户发布一条信息时,这条消息进入队列等待被处理,处理时先找到所有关注这个用户的所有用户,然后去看这些用户的缓存中是否存在 Timeline,如果存在就把消息推送过去(Redis 支持 List / Set 元素级别的操作),如果不存在就不推送,等到相应的用户上线的时候通过他关注的好友发送过的消息重新生成 Timeline 并且缓存下来,并且等到一定时间后用户的 Timeline 会过期掉。这样做的好处是不会把所有用户的 Timeline 都放入内存,只会存放一些比较活跃用户的数据有效的降低了内存的使用,同时还保留了推送机制,保证用户能机制收到关注的消息。

对于 Redis 的使用,我们的策略是多主从实例分片。也就是说每一组 Redis 都是一主一从,主服务器不持久化(Redis 早期版本持久化有性能问题),从服务器复制并且进行持久化(方便快速恢复数据),有多组这样的组合来避免一定时期的未来数据量增大后需要重新分片的问题。

InfoQ当初为什么要选择使用 Node.js 来做前端工作?

雪球网对于熟悉了 JavaScript 的前端工程师们来说,Node.js 最大的好处就是可以用相同的语言进行服务器端编程。这是我们最初选择 Node.js 的一个主要原因。我们的后端是用 Java 做的,前端工程师对 JSP 不熟悉,要多花一些精力去学习,而且在工作的时候和后端耦合度相对高。如果可以用 JavaScript 来渲染页面,前端工程师就可以有更大的空间,后端工程师也不用再和善变的页面打交道了。

使用 Node.js 来渲染前端页面,通过 API 获取后端数据,前后端分离通过标准的 API 进行交互,让整个系统架构更加清晰。而且因为都是 JavaScript,很多地方的服务器端代码和浏览器内代码甚至可以做到复用。前端想要对页面进行重构优化的时候也不再需要打扰后端工程师,大家都可以更专注于自己的事情。

前端工程师拥有了 Node.js 之后也可以写一些优化工作流程的工具,比如我们现在用 Node.js 搭建了测试环境、代理服务器、静态文件自动部署脚本,让前端团队的开发过程更加自动高效。

另外,Node.js 社区发展非常迅速,贡献了很多质量很高的框架模块,比如我们正在使用的 web 框架 express 等。

InfoQ请问为什么仍要选择 Java 来处理后端的工作?

雪球网:最初选择用 Java 的原因一定是因为团队中的成员的 Java 背景,更熟悉 Java 平台的优点缺点以及最佳实践。现在再反过来找一下优点,可以从以下的方面说明:

  • 熟悉 Java 的工程师很多,我们很容易找到需要的人,很多年以来 Java 都一直位居 TIOBE 的首位
  • Java 平台的性能已经的到多年的验证
  • Java 平台上众多的第三方产品、类库无所不有
  • 基于 JVM 的动态 / 函数式语言也给了 Java 平台良好的扩展性

现在如果说用 Java / JSP 来开发网站,那显然太过于重量过于繁琐了,肯定不如 RoR / PHP 等动态脚本语言灵活快速。由于我们前端已经完全剥离,而 Java 只作为后端接口 / 中间件的实现语言,可以提供更好的稳定性、扩展性。

InfoQ雪球网的技术架构中使用了哪些云服务?为什么要选择这些服务?使用效果如何?

雪球网:我们使用过一段时间某个厂商的云托管服务,不过还不是很成熟,完全没法做到 AWS 式的全自主弹性服务,所以最终我们还是选择了自己托管服务器的方式。

图片存储我们现在正在使用又拍云存储( upyun.com )的服务,因为我们的图片量不是特别大,单独去维护一套图片 / 文件服务器并且还要考虑到 CDN 这对我们这个团队来说代价太高了,upyun 的编程维护接口也还算方便,图片显示速度也不错,解决了我们的一个不小的问题,值得推荐。

InfoQ雪球网目前最需要哪些方面的技术人才?

雪球网:坦白的说我们的团队经验还不是那么丰富,所以很希望各种资深的开发工程师、架构师、数据挖掘工程师加入我们。我们也认为对于工程师来说,好奇心、兴趣、踏实、责任感、主动、具有分享精神都是我们非常期待看到的。

关于雪球财经

雪球财经是一家奉行价值投资理念的互联网金融信息服务公司。公司旗下的投资交流平台雪球 xueqiu.com ,给投资者提供跨市场、跨品种的数据查询、新闻订阅和互动交流服务,目前已覆盖 A 股、港股、美股市场。 雪球财经旗下还拥有服务中国美股投资者的 i 美股 imeigu.com 。雪球财经还发布反映中国概念股整体市场状况的中国概念股指数。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-04-08 21:5620887
用户头像

发布了 479 篇内容, 共 176.3 次阅读, 收获喜欢 53 次。

关注

评论

发布
暂无评论
发现更多内容

TIKV 分布式事务--加锁的 KEY 是什么

TiDB 社区干货传送门

TiDB 底层架构 TiDB 源码解读

Java实战1

thinkers

线程池、Lambda、Java实战

把简单留给用户,把复杂交给 AI

Kyligence

大数据 AI 数据治理 指标平台

Redisson 框架中的分布式锁

emanjusaka

Java redis redisson 分布式锁

软件测试管理进阶,快速掌握高效沟通的汇报技巧

测试人

软件测试 自动化测试 测试开发 测试管理

探索AIGC在腾讯自选股应用

ninetyhe

腾讯 AI 大模型 AIGC

测试管理进阶 | 快速掌握高效沟通的汇报技巧

测吧(北京)科技有限公司

测试

Solidity案例详解(四)投票智能合约

BSN研习社

区块链 Solidity

英特尔x爱立信:以开放式移动网络加速未来关键领域数字化转型

E科讯

面试官:说说SSO单点登录的实现原理?

王磊

Java 面试

JavaScript中的包装类型详解

秃头小帅oi

JavaScript 前端

文心一言变身虚拟患者,助力医学生轻松开启「实践模式」

飞桨PaddlePaddle

百度 paddle 百度飞桨 开发者说 文心一言

哪里有office2016安装包?office2016下载含激活工具

Rose

office办公套件 office2016

【论文精读】| 综述:模糊测试的艺术、科学和工程(下)

云起无垠

一文了解TiDB的资源管控(Resource Control)能力

TiDB 社区干货传送门

实践案例 新版本/特性解读 7.x 实践

英特尔携手AT&T、德国电信等推动vRAN创新,AI技术提升网络能效

E科讯

化是渐化,变是顿变:一窥 OpenAI Sora 相关技术的演进

Baihai IDP

程序员 AI openai 白海科技 GenAI

阿里云大降价后,与主流云厂商的价格对比,你选哪家?

NineData

数据库 阿里云 服务器 云厂商 阿里云降价

“智慧工程”助力房企突破发展瓶颈,精细化管理降本增效

Kyligence

大数据 数字化 解决方案 精细化管理

Axure RP 9 与其他原型设计工具的比较:为何它是您的最佳选择?

Rose

原型设计 Axure RP 9汉化 Axure RP 9授权码

资深项目管理者教你快速掌握高效沟通的汇报技巧

霍格沃兹测试开发学社

有道QAnything背后的故事---关于RAG的一点经验分享

有道技术团队

语言 & 开发 #开源

Javascript 重难点总结分享,看到就是赚到!

秃头小帅oi

Module2作业

大鹏

手把手带你快速上手香橙派AIpro

华为云开发者联盟

人工智能 华为云 昇腾 华为云开发者联盟 AI开发板

易点天下旗下出海应用数据分析与增长模型平台即将发布,一大波内测福利正在袭来!

新消费日报

运维一款月变更70+次的服务,是一种什么体验?

华为云开发者联盟

开发 华为云 华为云开发者联盟

WebSocket 连接保持方法详解

Apifox

程序员 前端 后端 websocket 长连接

TIKV 分布式事务--悲观锁

TiDB 社区干货传送门

TiDB 底层架构 TiDB 源码解读 TiKV 源码解读 TiKV 底层架构

软件测试学习笔记丨 k8s环境部署实战

测试人

软件测试 测试开发

马帮ERP与ETLCloud快速同步

谷云科技RestCloud

数据同步 ETL 数据集成 ERP

专访雪球网技术团队:用Node.js做前端的类SOA架构_SOA_郑柯_InfoQ精选文章