push推送服务设计
PUSH系统架构设计简述
一.网络传输协议的选择
PUSH系统协议选取:
UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂,那就非TCP协议莫属了,要考虑的同样也有很多,特别是如果有海量用户的需求。
a)基于TCP协议的长连接;
b) 基于websocket的轮询;
c)基于http的短链接Pull方式;
二.应该选择什么格式的数据协议
对于客户端和服务端的数据传输通常会有以下几点考虑:
1.网络数据大小——占用带宽,传输效率:虽然对单个用户来说,数据量传输很小,但是对于服务器端要承受众多的高并发数据传输,必须要考虑到数据占用带宽,尽量不要有冗余数据,这样才能够少占用带宽,少占用资源,少网络IO,提高传输效率;
2.网络数据安全性——敏感数据的网络安全:对于相关业务的部分数据传输都是敏感数据,所以必须考虑对部分传输数据进行加密;
3.编码复杂度——序列化和反序列化复杂度,效率,数据结构的可扩展性,可维护性:对于平台相关业务的代码实现也需要考虑到数据发送方和数据接收方数据处理的复杂度和数据结构的可扩展性,可维护性,人力成本和实施复杂度也必须考虑在内;
4.协议通用性——大众规范:数据类型必须是跨平台,数据格式是通用的,大家普遍能接受上手的;
以下我们通过几种不同类别的协议数据类型进行比较:
A)自定义二进制
优点:信息体积小
缺点:编码复杂度高(自己定义消息格式,自己编写序列化和反序列化方法,自己进行容错处理,可扩展性不强,比如添加个字段,就必须改两端的逻辑处理)
B) 提供序列化和反序列化库的开源协议:
优点:是一种流行的通用数据格式,扩展相当方便,序列化和反序列化相当方便(有相应库),错误处理方便(库支持);
C) 文本化协议:
比如xml,json,xmpp
优点:序列化,反序列化容易(库支持),调试方便,可视化强
缺点:相对于二进制存储占用体积大
三.架构设计
架构考量:
由于采用可靠传输协议TCP,考虑到负载问题(长连接的保持、消息推送等);
后台架构的灵活性、可扩展性,支持分布式,可横向扩展,易伸缩,高可用。同时把网络层、业务逻辑层、数据层分离,网络层和业务层支持负载均衡策略、数据层支持分布式存储。
架构图

PUSH推送服务架构图:

架构设计说明:
A) 右侧四大组件分别是ZK服务、配置中心、日志系统、监控系统.
1)Log System 主要负责业务日志输出,主要有链接相关日志、推送链路日志、心跳日志、监控日志等;
2)Monitor 主要用作系统状态监控,可用于系统调优,包括内存,线程,系统堆栈,GC等情况;
3) ZK Client 主要负责注册长链接ip:port,网关ip:port以及监听各个节点变化,同时增加了缓存;
4) Config-Center 是PUSH Server 配置化服务。
B)Core模块分别是长链接服务,网关服务,Packet编解码及消息分发模块,Message序列化及处理模块。
1)ConnectServer用于维持和客户端之间的TCP通道,主要负责和客户端交互;
2)ConnectionManager主要负责链接管理,定时检查链接情况,是否读写超时,如果链接断开发出相应的事件给路由中心去处理;
3) RSA/DES加解密,主要是消息传输中的DES加解密,以及登录的RSA会话密钥生成及Session复用;
4)Send/Receive-Packet主要负责消息的发送和接收;
5)Packet主要是协议部分的数据包编解码和包的完整性校验等;
6) Message部分是处理消息的序列化,还有消息压缩、加密等。MessageHandler会根据不同消息独立处理自己所属的业务,主要有:心跳响应、握手及密钥交换、快速重连、登录/退出用户等。
7)MessageDispatcher消息分发 包括分发策略,发送在线设备,存储离线设备信息等。
8)路由中心主要包括:远程路由,用户在线管理等;
a) Router—Center负责维护用户+设备与链接所在机器IP及链接之间的关系;
b) UserManager主要处理用户上下线事件的广播,以及单台机器的在线用户及数量的维护和查询;
C)存储部分:
1)Redis主要存储离线设备信息,登录设备信息和组信息等,其集群支持水平横向扩展,双写,主备,hash 等特性;
2)Mongo集群,支持副本集和分配,主要存储消息流水信息,以便做查询汇总等处理。
服务端平台及技术选型
系统开发平台: CentOS——Linux系统,稳定可靠、可定制优化、支持丰富;
缓存存储层: Redis——支持丰富的存储结构,支持分布式存储;
数据库: MySQL/Mongo——最适合互联网的数据库,免授权、高效稳定、可控性高;
开发语言: golang/erlang——高并发,跨平台;
部分热点问题考量
编码角度:采用高效的网络模型,线程模型,I/O处理模型,合理的数据库设计和操作语句的优化;
垂直扩展:通过提高单服务器的硬件资源或者网络资源来提高性能,如Linux内核参数,网络协议栈参数调优等;
水平扩展:通过合理的架构设计和运维方面的负载均衡策略将负载分担,有效提高性能;后期甚至可以考虑加入数据缓存层,突破IO瓶颈;
系统的高可用性:(防止单点故障)
在架构设计时做到业务处理和数据的分离,从而依赖分布式的部署使得在单点故障时能保证系统可用。
对于关键独立节点可以采用双机热备技术进行切换。
数据库数据的安全性可以通过磁盘阵列的冗余配置和主备数据库来解决。
(转载请注明出处本文出处: https://www.cnblogs.com/unqiang/p/9258739.html)
push推送服务设计的更多相关文章
- Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- Netty_Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- 【netty】Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- Netty系列之Netty百万级推送服务设计要点(转)
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- 58同城高性能移动Push推送平台架构演进之路
本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问 ...
- 转: 58同城高性能移动Push推送平台架构演进之路
转: http://geek.csdn.net/news/detail/58738 文/孙玄 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需 ...
- Netty学习总结(3)——Netty百万级推送服务
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)
在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...
- APNS push server端 SSL3.0 转 TLS (iPhone苹果推送服务)
(转载此文,请说明原文出处) 苹果的官方公布 Update to the Apple Push Notification Service October 22, 2014 The Apple Push ...
随机推荐
- POJ 3470 Walls(线段树+扫描线)
[题目链接] http://poj.org/problem?id=3470 [题目大意] 给出几面墙,均垂直于x轴或者y轴,给出一些鸟的位置(二维坐标点), 鸟只会垂直x轴或者y轴飞行,并且会撞上最近 ...
- onWebView检查网页中文
问题:要检查网页中的一段文本: 开始我是这样写的: private final static String SPECIFIED_TEXT = "这个是一段中文"; onWebVie ...
- tensorflow cnn+rnn基本结构
#CNN x = tf.placeholder(tf.float32,[None,input_node],name="x_input") y_ = tf.placeholder(t ...
- 在eclipse中使用Lombok
1.下载Lombok.jar http://projectlombok.googlecode.com/files/lombok.jar2.运行Lombok.jar: java -jar D:\001 ...
- Python 自用代码(scrapy多级页面(三级页面)爬虫)
2017-03-28 入职接到的第一个小任务,scrapy多级页面爬虫,从来没写过爬虫,也没学过scrapy,甚至连xpath都没用过,最后用了将近一周才搞定.肯定有很多low爆的地方,希望大家可以给 ...
- 配置多层NAT和端口映射实现外网访问内网
配置多层NAT和端口映射实现外网访问内网 背景和原理 通过配置NAT可以实现内网中不能直接访问外网的主机通过NAT代理访问内网,配置方法这里不再赘述(前文有介绍).本文以两层的NAT代理做模拟,通过端 ...
- 【ecshop---新增包邮卡功能】
一:需求分析 项目组要求新增类似虚拟卡的包邮卡,用户获得包邮卡的方式包括后台发送和前台自助充值.包邮卡有使用期限.订单使用包邮卡免除邮费.可以和其他优惠活动同时进行! 二:开发功能点 后台:新增包邮卡 ...
- elasticsearch 插入数据
1.单条插入(推荐设定主键id防止重复) public static String addIndex(String index,String type,HashMap<String, Objec ...
- redis学习笔记——入门
基本安装和用法:http://www.tuicool.com/articles/QzMRNb Redis如何通过本机客户端访问远程服务器段:http://blog.sina.com.cn/s/blog ...
- 使用Gulp定制前端开发环境
1.安装package.json中依赖了的组件 npm install 2.来到本地路径,创建工程配置文件 npm init 3.本地安装gulp npm install gulp --save-de ...