之前项目做过一个有关股票行情的系统,是一个典型的分布式系统,近段时间整理了下架构,做一下总结。
先上一张架构图:
在上面的途中,其实行情系统主要涉及到四个程序模块:
1.行情服务器模块,这个模块负责接收行情源的数据,做解析处理,将处理好的数据写入到redis上面。
2.行情API接口模块,这个模块用来与APP交互,接收APP的各种请求,做相应的业务逻辑处理。
3.SOCKET推送模块,该模块用来向APP推送实时的行情数据。
4.通用消息模块,这个模块主要也是用来推送消息,但其推送的消息与SOCKET推送的消息不同,推送各种间歇性的消息。
除了上面的4个程序模块,还有两个服务模块:
1.zk集群,主要用来对各个模块进行HA管理,进行Leader选举,防止单点故障,确保集群各个模块的稳定。
2.Nginx模块,用来对APP发送过来的请求进行负载均衡处理。
还有一个数据模块:
redis,为了确保redis的稳定,也采用了redis的sentinel模式(哨兵模式),防止单点故障
两个典型的工作流程:
1.排行榜的查询,先由行情服务器将数据写入redis,然后API模块接收客户端的查询请求,读取redis上的数据,做优化处理之后,返回分时数据给客户端。
2.排行榜的推送,API模块接收客户端的订阅请求,然后API通过PUB/SUB机制通知SOCKET推送模块客户端订阅了排行榜。
SOCKET推送模块就读取redis上的数据,通过socket长连接持续向客户端推送行情信息。
几个需要关注的地方:
1.行情服务器模块和SOCKET推送是主备的关系,即只有master节点处于工作状态。
2.行情API接口模块和消息模块可以是多个节点同时工作,这时在前面加上一个nginx服务器来做负载均衡。
3.redis在其中发挥了两种功能,一种是基本的读写功能,还有一个是pub/sub功能,也可以用来在不同的模块中通信。
4.在SOCKET推送中,并不一定是用户是登录状态的时候才给用户推送消息。