作者:李弈远
消息推送平台为公司内部和第三方应用提供统一消息推送服务,支持广播、私信、组播、附件等多种消息推送方式,覆盖IOS、Android、PC、Web等多种终端,并根据应用特定需求制定各种解决方案。
平台支持水平扩展,支持C5000K高并发下的实时消息推送,通过动态负载均衡、隔离部署、LXC虚拟化和监控报警等多种机制确保系统 的高可用,通过高可用消息队列、自动重连和ACK等机制实现消息可靠性(QoS1),并提供SDK方便产品和应用接入。
本文将在介绍消息推送服务相关功能/非功能特性的基础上,就系统为实现高可用进行的架构设计及部署方案进行探讨。
系统运行时监控及异常报警
消息可靠性满足QoS1
高性能
消息推送平台主要包括如下子系统:
Push Server:负责接收产品服务端发送的消息,并转发给高可用消息队列。连接建立过程中,采用连接池、超时检测、自动重连、单连接多channel等多种机制确保消息发送稳定性和性能
推送平台子系统的实现涉及多种编程语言和模型,由此部署方式也各不相同,以下将就几个主要子系统的部署方式进行说明。
Push Server基于Tomcat搭建http接口服务,其部署方式为典型的web服务部署方案,即LVS+Nginx+Tomcat实现负载均衡和高可用,其中Tomcat部署在云主机上,便于快速水平扩展和垂直扩展。
高可用消息队列基于RabbitMQ搭建。RabbitMQ提供了集群服务,但并不支持负载均衡。虽然连接到RabbitMQ集群的任意节点都可以访问集群中的任意消息队列,但一个消息队列只存储在一个物理节点上,其它节点只存储该队列的元数据,这使得当队列里只有一个队列时,系统性能受限于单个节点的网络带宽和主机性能,且存在单点故障。
高可用消息队列服务在兼容AMQP协议的基础上开发了分布式代理层MQProxy实现负载均衡,客户端的消息生产和消费请求先通过LVS或HAProxy分流到MQProxy节点,再由MQProxy分流到后端多个RabbitMQ结点。整个集群采用无状态设计,MQProxy及后端的RabbitMQ结点都可以水平扩展。
推送平台对消息可靠性极高,为此消息生产和消费采取了confirm+ack模式,队列部署采取持久化+HA模式,目前配置为单副本,为节省服务器资源,副本采取两两互为备份方式。
接入点采用非阻塞事件驱动编程语言nodejs处理高并发长连接。由于nodejs采用单进程模式运行,因此在多核服务器上需要部署多个进程才能充分利用服务器资源。为了实现进程间隔离,并减少性能损耗,系统采用LXC半虚拟化方式对进程进行部署,前端则利用LVS-DR模式实现负载均衡。
下篇将从监控等层面详细介绍推送平台系统是如何进行服务质量保障的。