gopush-cluster 架构

前言git

gopush-cluster是一套golang开发的实时消息推送集群,主要分享一下开发这套系统的想法和思路。github

架构golang

主要分为三个模块来开发,comet/web/message。web

comet安全

主要负责消息排队、消息推送以及和客户端的链接维护;整套系统依据是消息ID顺序原则获取消息(客户端本地获取最大的消息是1,那么以后获取的消息就是大于1的,获取离线消息的时候也要从上次最大消息ID来获取),所以消息推送之后须要在comet中排队而后发起RPC给message实现存储。架构

message 负载均衡

主要负责消息的存储和读写;接受来自comet模块的消息进行持久化,或者接受web模块的读取消息请求获取离线消息。message是能够部署多个节点来负载来自大量comet的推送压力,好比不一样的comet使用不一样的message节点(节点无状态),以后在comet也会作多message节点的负载均衡RPC调用和故障转移(TODO)。测试

web优化

主要负责节点询问,以及离线消息获取和后台节点管理等;节点询问主要依据客户端的订阅Key一致性hash计算出链接的comet节点地址,所以海量客户端链接的时候能够打散到多个comet来服务;另外离线消息也是经过web接口返回给客户端的,可是消息的读取是经过RPC发送给message模块的,尽可能的职责单一。web节点由于无状态,能够部署多个web,来实现负载均衡和故障转移。blog

thrid-part

消息存储如今主要依赖Redis进行消息读写(Sorted Set),由于Sorted Set不支持int64类型的Score(咱们也开发了一个支持int64 Score的分支可是由于时间缘由没有大量测试上线),以后可能会使用HBase集群代替Redis的使用,已提供更安全的离线消息存储(TODO)。

另外使用了Zookeeper来实现的同一个comet的故障转移,例如comet 节点1能够有一个备选节点节点2,当节点1注册到zookeeper以后,由于机器或者其余缘由宕了,这时候会在web层触发zookeeper的选举选中节点2来服务。

结束语

gopush-cluster大体的架构就说到这了,以后会写其余模块细节以及优化和遇到的问题。

相关文章
相关标签/搜索