猪小花1号

个人签名

282篇博客

消息推送平台高可用实践(上)

猪小花1号2018-09-03 14:08

作者:李弈远


消息推送平台为公司内部和第三方应用提供统一消息推送服务,支持广播、私信、组播、附件等多种消息推送方式,覆盖IOS、Android、PC、Web等多种终端,并根据应用特定需求制定各种解决方案。
平台支持水平扩展,支持C5000K高并发下的实时消息推送,通过动态负载均衡、隔离部署、LXC虚拟化和监控报警等多种机制确保系统 的高可用,通过高可用消息队列、自动重连和ACK等机制实现消息可靠性(QoS1),并提供SDK方便产品和应用接入。
本文将在介绍消息推送服务相关功能/非功能特性的基础上,就系统为实现高可用进行的架构设计及部署方案进行探讨。

一、系统特性

1.1 功能特性

  • 提供服务端SDK和各类终端SDK简化产品接入
  • 对接入的产品服务端和终端进行安全认证
  • 支持跨产品消息推送
  • 支持广播、私信、组播、附件推送等多种消息推送方式
  • 根据自定义条件筛选终端用户进行推送
  • 支持IOS、Android、Web、PC、智能设备等多种终端
  • 针对典型应用场景的各种解决方案
  • 对接入的各产品进行统一配置管理
  • 对推送效果进行统计
  • 系统运行时监控及异常报警

    1.2 非功能特性

  • 消息可靠性满足QoS1

  • 各种消息推送方式互不阻塞
  • 具备快速水平扩展能力
  • 系统高可用,无单点故障
  • 异常隔离不扩散
  • 消息推送路径跟踪及快速故障诊断
  • 服务质量实时监测
  • 易运维
  • 支持C5000K高并发
  • 终端流量电量损耗低于同类产品
  • 高性能

    二、架构设计

    2.1 系统架构图

  • 2.2 架构说明

    消息推送平台主要包括如下子系统:

  • Push Server:负责接收产品服务端发送的消息,并转发给高可用消息队列。连接建立过程中,采用连接池、超时检测、自动重连、单连接多channel等多种机制确保消息发送稳定性和性能

  • 高可用消息处理中心:基于RabbitMQ实现高可用消息队列服务,负责根据消息接收终端和消息发送模式对消息进行路由,基于负载均衡支持水平扩展,基于持久化、confirm/ack、HA、流控等机制实现高可用,基于二级路由策略隔离不同类型消息避免阻塞
  • 调度服务:负责从消息队列中获取消息进行解析,根据消息类型获取接收者信息,并投递给其所在的接入点
  • 消息存储:基于Redis为终端连接、终端上报数据、消息内容、离线消息等提供存储访问服务,采用基于Sharding的Master-Slave方案实现高可用
  • 接入点:负责管理和维护用户终端长连接,并将消息最终投递给用户终端。基于负载均衡支持水平扩展,采用LXC多结点部署、客户端重连、进程假死检测、重连退避等机制实现服务隔离和高可用
  • 终端SDK:提供给各类终端,如Android、IOS、PC、Web等,提供API简化其接入流程和复杂度,负责接收接入点下推的消息,并通知对应的APP进行处理。基于长连接、心跳退避、自动重连、ack、链路复用等机制确保消息的可靠接收,并减少了流量和电量等消耗
  • 过滤服务:负责存储终端上报的数据,并根据过滤条件筛选目标用户列表,过滤条件支持逻辑组合和黑名单功能
  • 权限认证服务:基于OAuth签名认证机制对产品服务端发送消息和用户终端接收消息进行安全认证,避免消息被篡改及冒名发送/接收等
  • 统计服务:对广播、附件等推送模式的推送效果,如实际接收用户数目、发送时间等进行统计,以评估系统运行状况,同时提供给产品方进行参考
  • 监控报警服务:负责从服务器资源、应用层、服务质量等多个层面对系统的运行情况进行运行时监控和异常报警,实现对系统故障的及时诊断和恢复,以确保服务的7*24小时正常运行
  • 管理服务:对接入推送服务的产品进行配置管理,如分配密钥对,设置产品接入终端类型,管理产品间消息互通权限,设置产品群组信息获取接口等

    三、部署方案

    推送平台子系统的实现涉及多种编程语言和模型,由此部署方式也各不相同,以下将就几个主要子系统的部署方式进行说明。

    3.1 Push Server

    Push Server基于Tomcat搭建http接口服务,其部署方式为典型的web服务部署方案,即LVS+Nginx+Tomcat实现负载均衡和高可用,其中Tomcat部署在云主机上,便于快速水平扩展和垂直扩展。

    3.2 高可用消息处理中心

    高可用消息队列基于RabbitMQ搭建。RabbitMQ提供了集群服务,但并不支持负载均衡。虽然连接到RabbitMQ集群的任意节点都可以访问集群中的任意消息队列,但一个消息队列只存储在一个物理节点上,其它节点只存储该队列的元数据,这使得当队列里只有一个队列时,系统性能受限于单个节点的网络带宽和主机性能,且存在单点故障。
    高可用消息队列服务在兼容AMQP协议的基础上开发了分布式代理层MQProxy实现负载均衡,客户端的消息生产和消费请求先通过LVS或HAProxy分流到MQProxy节点,再由MQProxy分流到后端多个RabbitMQ结点。整个集群采用无状态设计,MQProxy及后端的RabbitMQ结点都可以水平扩展。
    推送平台对消息可靠性极高,为此消息生产和消费采取了confirm+ack模式,队列部署采取持久化+HA模式,目前配置为单副本,为节省服务器资源,副本采取两两互为备份方式。

    3.3 接入点

    接入点采用非阻塞事件驱动编程语言nodejs处理高并发长连接。由于nodejs采用单进程模式运行,因此在多核服务器上需要部署多个进程才能充分利用服务器资源。为了实现进程间隔离,并减少性能损耗,系统采用LXC半虚拟化方式对进程进行部署,前端则利用LVS-DR模式实现负载均衡。

  • 下篇将从监控等层面详细介绍推送平台系统是如何进行服务质量保障的。



网易云大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者李弈远授权发布。