本文来自网易云社区

作者:李弈远

消息推送平台为公司内部和第三方应用提供统一消息推送服务,支持广播、私信、组播、附件等多种消息推送方式,覆盖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

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

相关文章:
【推荐】 一个只有十行的精简MVVM框架(下篇)
【推荐】 漫画解读“跨视图粒度计算”,了解有数分析利器

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

  1. 消息推送平台高可用实践(下)

    消息推送平台高可用实践(下) 消息推送平台现已为几十个产品提供推送服务,同时在线用户连接数超过300w,日收发消息量达几千万,对消息的实时性和可靠性均提出了较高的要求.上篇 从架构设计和部署方案角度介 ...

  2. 如何构建一套高可用的 APP 消息推送平台

    转载自  如何构建一套高可用的 APP 消息推送平台 消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用.本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行 ...

  3. 如何构建一套高可用的移动消息推送平台?

    消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用.本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行深入剖析,围绕消息推送时产生的服务不稳定性,消息丢失. ...

  4. 干货 | Reactive模式在Trip.com消息推送平台上的实践

    作者简介 KevinTen,携程后端开发工程师,关注Reactive和RPC领域,深度参与开源社区,对Reactive技术有浓厚兴趣. Pin,携程技术专家,Apache Dubbo贡献者,关注RPC ...

  5. 京东架构师:亿级消息推送平台架构实践!9页ppt一次讲透

    点击"技术领导力"关注∆  每天早上8:30推送 来源:京东商城架构团队 每个app或者业务都有将信息推送到用户客户端的需求.作为中台的推送平台,需要为公司内部许多个不同app同时 ...

  6. 京东大规模消息推送平台搭建实践

    背景 每个app或者业务都有将信息推送到用户客户端的需求.作为中台的推送平台,需要为公司内部许多个不同app同时提供可用,稳定的推送服务,因此我们消息推送平台应运而生. 推送平台架构 名词解释: dt ...

  7. 如何构建一个消息推送平台

    01 背 景 B/S架构下很多业务场景下我们需要服务端主动推送消息到客户端,在html5之前一般使用长轮询(除此之外还有iframe流或者Flash Socket)的方式来实现,而长轮询的方式缺点很明 ...

  8. 基于SpringBoot、RabbitMQ的Android消息推送平台搭建

    消息推送,类似于微信来新消息时出现在通知栏那种情景.很多APP都有这个功能.现在有很多第三方平台可以实现这个需要,但是有的公司对所要推送的消息保密要求比较高,不希望被第三方看到,可以使用此种方式进行消 ...

  9. Android 生态消息推送平台介绍

    一.手机厂商平台 华为消息推送服务 华为推送(Push)是为开发者提供的消息推送平台,建立了从云端到手机端的消息推送通道,使应用可以将最新信息及时通知用户,从而构筑良好的用户关系,提升用户的感知和活跃 ...

最新文章

  1. java反射中,Class.forName和classloader的区别
  2. 【c++】映射表std::map
  3. js里的null 与undefined
  4. arpanet(阿帕网)
  5. openssl里面AES算法主要函数的参数的介绍
  6. PHP好玩的代码一(笛卡尔的情书)
  7. Android WebView 使用漏洞问题
  8. “见识”很重要 记一起Oracle的SQL调整
  9. 《推荐系统笔记(十三)》购物篮分析 —— 基于关联规则的topN推荐
  10. Python 利用*args和**kwargs解决函数遇到不确定数量参数问题
  11. JavaScript 字符串与数字的相互转换
  12. Excel怎么隐藏指定文本单元格整行
  13. ubuntu_linux命令TX2学习总结
  14. 我们终究是一群平凡的人
  15. pycharm更新pip提示Requirement already satisfied
  16. 基于JAVA汽车租赁系统计算机毕业设计源码+数据库+lw文档+系统+部署
  17. 申宝证券-A股市场的普涨
  18. python计算点到面的距离
  19. uni-app图片显示
  20. 【赛纳斯】EC Raman电化学拉曼光谱检测系统推动科研新突破

热门文章

  1. Talend抽数工具使用整理
  2. 上下左右键控制ultraGrid单元格数据的移动
  3. 嵌入式单元测试工具Tessy的一些测试技巧
  4. node.js简单实现post请求
  5. DCMM数据管理能力成熟度与CCRC信息安全服务资质的区别是什么?
  6. 微信小程序 RTMP 音视频 通话 ffmpeg_音视频面试基础题
  7. Ubuntu 22.04环境下安装lxr源码阅读器详细过程
  8. 一条收藏已久的秘方!
  9. Solidity最强对手:MOVE语言及新公链崛起
  10. ZCC51403替代LM27403