**

四、 推送系统的集群化

**

4.1长连接集群

推送系统作为一项基础服务,它需要承载全部在线用户量,对于移动互联网行业,在设计之初的期望目标用户量就非常大,并且用户未来一段时间的增长量通常难以预估,因此要求在设计推送系统时,都要求能够集群化部署、支持动态扩展。那么长连接集群化设计时需要解决那些问题呢?
个人认为长连接服务需要解决三个问题:路由、管理和动态扩展;另外,如果想要锦上添花,让长连接通道更加安全,还可以在长连接的集群管理中采取本文中所提出的应用层加解密方法。
路由是指长连接集群能根据目标用户的标识快速确定它所连接的长连接服务;在推送系统发送客户端的每个推送通知时,首先要找到它所连接的长连接服务,然后再将待发送的通知交付给长连接服务,由长连接服务发送到推送客户端。由此可以看到路由功能是长连接的核心功能,它直接决定了整个推送系统能否正确、高效地工作。
管理是指长连接集群的管理和调度服务对集群中的多个长连接服务进行分配、调度和管理的功能;具体包括:长连接服务的负载均衡和客户端分配信息的管理;负载均衡功能要根据每个长连接服务当前的负载压力,确定下一个客户端分配到它上面的概率,例如:长连接服务A上已经连接了20万客户端,而长连接服务B上目前只有10客户端,那么当新客户端请求连接进来时,长连接的集群调度服务将该客户端分配到A上的概率要远大于分配到B上的概率,从而对整个长连接集群进行负载均衡;负载均衡算法中需要综合考虑每个长连接服务的最大连接数的承载能力、目前已经承载的长连接数量,以及服务所在主机的CPU、内存、网络等各种因素。可以采取的如下措施来满足此要求:通过长连接服务或者配套的辅助软件协助上报这些数据到ZooKeeper上,然后由ZooKeeper负责将这些数据转发到集群调度和管理服务上。客户端分配管理主要管理长连接服务集群管理客户端和所分配的长连接服务的对应关系,它是进行路由算法的基础,这种管理方法可以通过算法或者缓存来完成,通过算法是指:长连接集群服务通过固定算法将客户端的标识映射到指定的长连接服务上,这种方式的优点是不需要长连接集群服务记录客户端分配到哪个长连接上,实现简单,缺点是:不利于动态扩展,它适合最大用户量可以预估的项目;通过缓存方式是指:长连接集群服务通过缓存记录下每个客户端所分配的长连接服务,在发送通知时,需要先查询缓存找到客户端对应的长连接服务,然后再将通知内容交付给对应的长连接服务,这种方式的优点是:易于扩展长连接服务,缺点是:实现相对复杂,需要考虑缓存的可靠性、访问效率、集群部署等问题;
动态扩展是指推送系统应能根据用户量的增加,动态增加新的长连接服务。长连接集群的动态扩展与缓存集群的扩展不一样,在缓存扩展时,需要动态迁移一部分数据到新增缓存节点上,而长连接服务中已经建立的长连接是不能被迁移的。
因此,长连接服务集群的管理技术和技巧非常重要,它主要体现在以下几点:
(1) 加强监控在线用户量的增长情况,要在长连接服务的承载能力范围内时就开始预先添加长连接服务,而不是等到现有系统承载不了的时候再添加;
(2) 合理制定负载均衡策略,当新增长连接服务时,不要在新增初期把新增的客户端全部都负载到新增的长连接服务上,而是以适当的高概率将新增用户导向至新长连接服务。
**

4.2 消息缓存集群

**
推送系统中主要用缓存集群存储待拉取的消息,在推送系统的消息缓存集群中,每个有待拉取消息的客户端都被分配一个消息队列,拉模式和混合模式中,所有发往该客户端的消息都会依次存储到该消息队列中,待推送客户端SDK拉取并处理之后,再由推送客户端SDK主动删除。
设计消息缓存时应该注意以下问题:
(1) 缓存集群的易扩展性;推送系统对缓存的使用将基于离线用户量(因为在线用户的消息将会很快被拉取走并删除)、每个用户的消息数量两个因素的增长而快速增长,它要求消息缓存集群的能非常方便扩展,以支持更多的客户端;
(2) 消息队列的时效性;推送系统不是IM,不应为用户提供太长时间甚至无限期的缓存,它缓存消息的时效性一般都远小于IM,因此,在推送系统中应该限制每个客户端的消息缓存队列的长度,可以采取的措施有很多,例如:限制时间或限制个数,限制时间是指推送系统为每个客户端缓存最近定长时间(例如2周)内的消息,如果客户端长时间不登录,缓存的消息一旦超过此时间,将会被缓存删除;限制个数是指推送系统为每个客户端限制了缓存消息队列的长度,一旦缓存的消息超过队列长度,再发送的消息将会挤掉最早的那条消息。无论采取哪种限制措施,基于安全性、代价、访问效率等各方面考虑,推送系统都应对消息缓存队列的长度进行限制。
(3) 缓存的易用性和及时性;推送系统所采用的缓存应该能直接满足消息存取的要求,以简化开发的复杂度,除此之外,缓存集群应能满足对消息队列的快速访问,包括:从指定位置开始读取、删除等。
消息缓存集群建议采用Redis来构建。Redis本身的数据结构类型非常丰富,例如它本身支持的List类型就可以直接用作消息队列;另外,Redis的访问速度也非常快,能够满足推送系统的需求。Redis的集群化方案也非常多,非常便于推送系统构建缓存集群,例如Codis,不过大多数集群方案不支持lua脚本和pipline等操作,如果实现过程中需要用到这些功能就要慎重考虑一下。
**

五、 心跳

**
心跳是指服务端或者客户端定期发送特定消息,以告知对端自己依然正常的消息发送机制,对端接收到该消息之后给予回复,心跳消息有时也被称为ping/pong消息。心跳机制的作用是让长连接服务能尽早检查出异常断开(未走正常的四次分手流程)的客户端连接。由于TCP协议本身无法感知弱网络情况下TCP连接的的连、断情况(详见《TCP对连接断开的感知——保活定时器》,地址为:https://blog.csdn.net/houjixin/article/details/19153325或http://houjixin.blog.163.com/blog/static/35628410201411310232267/),需要应用层采取措施定时检查连接是否有效;
需要注意:心跳机制由于需要定时发送心跳数据,它并不能及时检查客户端的连接好坏,因此服务端也无法实时感知到每个连接的状态(主要是弱网情况下的网络连接情况),在心跳间隔内,连接异常断开时,服务端依然无法感知。
心跳对客户端的影响
如果心跳时间太短,则频繁的心跳消息不仅会增加客户端的耗电量、流量,而且会对服务端产生较大的压力,尤其当长连接服务承载的连接量较大时,该问题尤为明显。如果心跳时间太长,则连接一旦异常断开,客户端与服务端都无法感知,自然也就无法及时完成消息推送。
心跳时间应该设置为多少?
首先要明确一点:不同网络情况下,心跳的限制值不一样,一般2G或早期3G时运营商会有5分钟的限制,在4G网络情况下,此值可能会大一些,在WIFI情况下该心跳数据还可以更长,有可能会达到部分OS对TCP的默认超时时间2小时,因此,建议在移动网络情况下尽量不要超过5分钟。
动态心跳
动态心跳是指心跳时间不是固定值,而是随着网络的状态而自动探测并设定合适的值,它既能减少客户端收发心跳数据包造成的耗电、耗流量的问题,也能满足尽快检测连接状态的需求,但是动态心跳实现起来非常复杂,考虑的场景比较多,一旦考虑不周就可能无法及时感知连接的异常断开;动态心跳有非常多中方法,这列举两种简单探测机制:(1)增量探测,根据网络类型确定探测的上限Amax和下限Amin,发送心跳包从下限Amin开始,每次都增加一个增量x,直到出现连接断开的情况或者达到上限Amax;这种方式尤其注意一旦出现连接断开要注意采取快速恢复机制,否则就可能造成短时间内客户端的频繁断开;(2)减量探测根据网络类型确定探测的上限Dmax和下限Dmin,发送心跳包从上限Dmin开始,每次都减去一个时间长度x,直到连接正常,或者到达下限,这两种实现机制太过简单,在实际运用过程中往往需要多次短开才能确定一个心跳值,而且确定的心跳值也不是最优的。
心跳包的发送频度优化
在自己开发长连接服务器时尤其要注意心跳包和业务包的结合可以大大降低心跳包的数量,例如一旦有任何消息正常收到或者发出,就认为该连接正常,此时就可以不用发心跳包,即有业务数据包时,把业务数据包也当做心跳包来使用;
客户端和服务端对心跳的检测机制
一旦客户端和服务端商定好心跳之后,后续心跳将按照协商的时间间隔发送心跳消息,此时主动发送心跳包的一方要在协商值之前发送心跳,例如实际发送心跳间隔为协商值80%,而接收心跳包的一方在检查心跳间隔的周期为协商值的1.5倍,这样可以防止网络传输延迟造成的连接误判。

关于推送系统设计的一些总结与思考(三)相关推荐

  1. 关于推送系统设计的一些总结与思考(一)

    关于推送.mqtt.mosquitto相关的讨论可加入群:221779856 消息与通知 本文中的消息是指交给推送系统的待发送字符串:通知是指推送系统内部,通过长连接服务发送给客户端的通知字符串,它只 ...

  2. 关于推送系统设计的一些总结与思考(二)

    ** 三. 消息推送的工作模式 ** 常见的消息推送系统的工作模式有:推模式.拉模式以及推拉混合模式三种,在很多推送系统中,采用在线消息直接推送下去,离线消息让客户端拉取,这种方式很容易造成漏消息的问 ...

  3. 看了极光推送技术原理的几点思考

    看了极光推送技术原理的几点思考 分类: android2012-11-26 20:50 16586人阅读 评论(18) 收藏 举报 目录(?)[+] 移动互联网应用现状 因为手机平台本身.电量.网络流 ...

  4. Android实战——第三方服务之Bmob后端云的推送服务的集成和使用(三)

    第三方服务之Bmob后端云的推送服务的集成和使用(三) 事先说明:这里的一切操作都是在集成了BmobSDK之后实现的,如果对Bmob还不了解的话,请关注我第一篇Bmob文章 步骤一:推送服务的集成 在 ...

  5. 日消息量突破 50 亿,谈小米的高可用推送系统设计

    小米推送是目前国内领先的推送服务提供商,主要为开发者提供快捷.准确.稳定的推送服务.目前日活跃设备突破3亿,日消息量突破50亿.本文将会介绍小米推送在提高系统可用性方面的一些经验和教训. 1.推送系统 ...

  6. 基于位置服务的信息推送系统设计

    1.1  研究目的与意义 随着空间信息技术和网络技术的快速发展,普通的地图信息展示已经无法满足人们的需求.GIS(Geographic Information System)作为拥有处理和分析空间信息 ...

  7. python考试系统的设计与实现开题报告_基于Python新闻定制推送系统设计与实现开题报告...

    2.国内外研究现状综述: 国外在新闻个性化推送跨平台开发领域方面起步较早,同时也有着相对完整的结构体系,在这种具有领先地位的研究以及企业级别应用中都是有所体现的.在2008年HTML_5草案的发布,是 ...

  8. 网易云信即时通讯推送保障及网络优化详解(三):如何在弱网环境下优化大数据传输

    对于移动 APP 来说,IM 功能正变得越来越重要,它能够创建起人与人之间的连接.社交类产品中,用户与用户之间的沟通可以产生出更好的用户粘性. 在复杂的 Android 生态环境下,多种因素都会造成消 ...

  9. Spring4.3+Webscket 实现聊天、消息推送详解之具体实现(三)

    2019独角兽企业重金招聘Python工程师标准>>> 前面可能废话太多了,下面进入正题,讲解spring具体的实现方式. 先来说一下几个核心的步骤吧: 1.构建websocket服 ...

最新文章

  1. 【复盘】小朋友的奇思妙想
  2. 无锡朗贤获B+轮融资,辰韬资本、兴韬投资领投
  3. Install Qt5 on Ubuntu 16.04
  4. 20161102学习笔记
  5. 以太网口差分电平_以太网接口学习笔记
  6. [architecture]-ARMV8的一些总结-一篇就够了
  7. html messagebox确定取消,Element MessageBox弹框的具体使用
  8. figtree需要在JAVA下运行吗_Phylogenomic_Tutorial || ML_Tree inference
  9. 解决Flex4 发布后访问 初始化极其缓慢的问题
  10. ezcad旋转轴标刻参数_EzCad 2.0 扩展轴标刻插件使用说明书简体中文(.pdf
  11. MSN 通信协议学习笔记(转)
  12. 计算机领域国际期刊,科学网—计算机国际期刊zz - 黄红星的博文
  13. 2020年中国车规级IGBT(新能源汽车用IGBT)市场规模现状及发展潜力分析[图]
  14. 九月开始复习计算机考研,2019计算机考研复习不要盲目开始
  15. 云帆文档管理系统版本更新说明:v4.6.0
  16. pmp考试是什么?有没有含金量?值得考吗?(附2023 年考试时间、备考资料)
  17. ChessBoard棋盘覆盖问题
  18. Shell命令-网络操作之基础之scp、wget
  19. 运算符(operator)
  20. 战拖方法一:适度乐观,建立自信(三)

热门文章

  1. 如何在有道云笔记的Markdown上上传本地图片(亲测好用,而且不用开会员)
  2. day32 java 多线程(3)了解篇
  3. ES6_模块化_note
  4. icmp时间戳请求和应答程序实现_ICMP报文详解之ping实现
  5. 网站云服务器资料本地备份,云服务器上备份本地数据
  6. rust全息要啥才能做_在 Rust 中不能做什么
  7. springboot pom文件添加mysql组件_SpringBoot整合mybatis-plus+druid组件,实现增删改查
  8. sql注入 练手网站_靶场sql注入练手----sqlmap篇(纯手打)
  9. pyqt tableview大数据自动退出_JAVAFX之tableview界面实时刷新导致的内存溢出(自己挖的坑,爬着也要出来啊0.0)...
  10. python异常处理_Python 工匠: 异常处理的三个好习惯