您的位置:首页 > 运维架构 > 网站架构

关于实时消息推送系统的架构之浅见

2016-04-26 10:37 295 查看

最近,有一个朋友问了一个问题:如何实现实时消息推送架构,当时只是说了比较笼统的概念,并没有进行深入的探讨。再加上时间比较也就没有进行一个归总。刚好今天进行一个梳理。具体内容如下



 

那么整体的设计如上。接下来我们针对每一块进行剖析

1、协议的选择

   关于协议的选择这块,现在比较常用的方式:XMPP、MQTT、自定义协议等,那么关于每种协议的优缺点,这里面我们不进行细致描述。只要知道最终的目的:

   (1)、协议轻量、编解码速度快捷;

   (2)、流量消耗小

2、连接方式 常用的连接方式:

      轮询、长连接、websocket等各种方式同样具有不同的优缺点,具体的目的

    (1)、连接稳定;

    (2)、不同网络环境使用不同的心跳间隔;

    (3)、app连接消耗平衡;

3、海量连接 针对海量连接都会使用到负载均衡;常见的方式:

    lvs/nginx做负载均衡、服务端负载均衡、客户端负载均衡;首先我们应该明白国内的网络环境关于dns的问题;可以通过ip来直接完成;通过预埋ip或者提供webservice来获取相关的ip等方式;

 关于负载均衡:

          (1)、lvs负载均衡存在单点问题:可通过提供一个vip来做高可用

          (2)、服务端负载均衡:选择负载低的服务器

          (3)、客户端负载均衡:采用跑马策略来完成负载均衡,同时也解决跨运营商网络慢的问题

4、消息重复 一般情况下,在网络正常的情况下,消息的发送可能一个平衡的状态。但是在不同网络环境2G/3G/4G/WIFI等,可能我们就面临消息重复的问题。在这个问题上我们一般采取的方式通过将回执--响应转为

        (1)、第一阶段欲请求:服务端发送通知到客户端,客户端接收到通知之后返回最近接收消息的最大序列号(将msg绑定序列号);

        (2)、服务端验证序列号避免消息重复;

        (3)、第二阶段正式发送消息:发送消息

5、运维、扩展 在上图的架构中并没有存在 服务管理、运营监控以及预埋服务(解决dns问题)

6、架构介绍 整个架构在逻辑上,划分四层:

    (1)、接口服务:提供推送服务接入

    (2)、分发服务:主要完成下行消息和上行消息的路由;同时提供一个对应的路由表,主要提供 clientId、GroupId、ServerId之间的关系映射。

    (3)、订阅信息:通过订阅的不同的消息,完成对应的消息的推送

    (4)、存储:防止消息的丢失 基本上整个架构就这样。其中有很多细节并没有进行一个很详细的阐述。同时在构建一个实时推送系统存在很多坑。这里面也没有进行详细描述和分析。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: