雪球网( 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 )关注我们,并与我们的编辑和其他读者朋友交流。
评论