【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

专访雪球网技术团队:用 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:5620280
用户头像

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

关注

评论

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

mmdetection训练数据遇到的问题

代码的路

Python 机器学习

粒子滤波 PF(Particle filter)算法

代码的路

机器学习

再获殊荣!图数据库 NebulaGraph 获得 ITPUB 2022 创新产品奖

最新动态

2022年IAA行业品类年度表现总结

易观分析

视频 IAA

互联网医疗月度观察:规范化、合法化的网络售药新时代到来

易观分析

互联网医疗

如何使用企业账户进行协作?

Towify

Python报错:ImportError cannot import name 'imresize'

代码的路

Python

数维图可视化编辑器超10项功能升级,您的需求就在其中

2D3D前端可视化开发

数据可视化 数字孪生 三维可视化 web3d web组态软件

如何使用免适配云鹰模组实现多网可切?——实践类

阿里云AIoT

安全 物联网 物联网安全 技术标签

Vue实现登录功能

代码的路

Vue

微信小程序实验案例:简易成语小词典

TiAmo

小程序 微信小程序

【1.6-1.13】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动

PyFlink 最新进展解读及典型应用场景介绍

Apache Flink

大数据 flink 实时计算

还在自建MQTT物联网平台?快来试试开源MQTT托管型物联网平台——实践类

阿里云AIoT

安全 物联网 物联网安全 技术标签

Linux安装与卸载软件

代码的路

Linux

10分钟玩转阿里云物联网平台设备接入、管理、运维——实践类

阿里云AIoT

安全 物联网 物联网安全 技术标签

35张图,直观理解Stable Diffusion

OneFlow

人工智能 深度学习 Stable Diffusion

中移链合约常用开发介绍 (二)多索引表的使用

BSN研习社

JDBC的基本概念

代码的路

Java

Python报错:ModuleNotFoundError: No module named 'xxx'

代码的路

Python

conda安装报错:PermissionError [Errno 13] Permission denied

代码的路

Python

电脑音视频暂停再继续,声音突然变大

代码的路

windows

如何理解鲁棒性?为什么robustness会翻译为鲁棒性?

九章云极DataCanvas

软件测试/测试开发 | 静态扫描体系集成

测试人

软件测试 持续集成 jenkins 自动化测试 测试开发

浅谈服务接口的高可用设计

京东科技开发者

负载均衡 接口 后端 混沌工程 企业号 1 月 PK 榜

智能图像处理:基于边缘去除和迭代式内容矫正的复杂文档图像校正

合合技术团队

图像处理 图像预处理 人工智能’

收官!OceanBase第五届技术征文大赛获奖名单公布!

OceanBase 数据库

数据库 oceanbase

pip安装报错:UnicodeDecodeError 'utf-8' codec can't decode byte 0xc3 in position 4

代码的路

Python

如何使用滑块实现切换图片功能?

Towify

Spring获取Bean的9种方式

小小怪下士

Java spring 程序员 springboot

Win10桌面图标显示问题

代码的路

windows

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