PUSH系统架构设计简述

一.网络传输协议的选择

PUSH系统协议选取:

UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂,那就非TCP协议莫属了,要考虑的同样也有很多,特别是如果有海量用户的需求。

a)基于TCP协议的长连接;

b) 基于websocket的轮询;

c)基于http的短链接Pull方式;

二.应该选择什么格式的数据协议

对于客户端和服务端的数据传输通常会有以下几点考虑:

1.网络数据大小——占用带宽,传输效率:虽然对单个用户来说,数据量传输很小,但是对于服务器端要承受众多的高并发数据传输,必须要考虑到数据占用带宽,尽量不要有冗余数据,这样才能够少占用带宽,少占用资源,少网络IO,提高传输效率;

2.网络数据安全性——敏感数据的网络安全:对于相关业务的部分数据传输都是敏感数据,所以必须考虑对部分传输数据进行加密;

3.编码复杂度——序列化和反序列化复杂度,效率,数据结构的可扩展性,可维护性:对于平台相关业务的代码实现也需要考虑到数据发送方和数据接收方数据处理的复杂度和数据结构的可扩展性,可维护性,人力成本和实施复杂度也必须考虑在内;

4.协议通用性——大众规范:数据类型必须是跨平台,数据格式是通用的,大家普遍能接受上手的;

以下我们通过几种不同类别的协议数据类型进行比较:

A)自定义二进制 

优点:信息体积小

缺点:编码复杂度高(自己定义消息格式,自己编写序列化和反序列化方法,自己进行容错处理,可扩展性不强,比如添加个字段,就必须改两端的逻辑处理)

B) 提供序列化和反序列化库的开源协议:

比如protocol buffers

优点:是一种流行的通用数据格式,扩展相当方便,序列化和反序列化相当方便(有相应库),错误处理方便(库支持);

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推送服务设计的更多相关文章

  1. Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  2. Netty_Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  3. 【netty】Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  4. Netty系列之Netty百万级推送服务设计要点(转)

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  5. 58同城高性能移动Push推送平台架构演进之路

    本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问 ...

  6. 转: 58同城高性能移动Push推送平台架构演进之路

    转: http://geek.csdn.net/news/detail/58738 文/孙玄 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需 ...

  7. Netty学习总结(3)——Netty百万级推送服务

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  8. app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)

    在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...

  9. APNS push server端 SSL3.0 转 TLS (iPhone苹果推送服务)

    (转载此文,请说明原文出处) 苹果的官方公布 Update to the Apple Push Notification Service October 22, 2014 The Apple Push ...

随机推荐

  1. lua的模式匹配

    模式: 字符类:(character classes) . all characters %a letters %c control characters %d digits %l lower -ca ...

  2. iptables 要点总结

    http://jiayu0x.com/2014/12/02/iptables-essential-summary/

  3. 浅谈Java中静态初始化块跟非初始化块

    众所周知在JAVA编程语言中有两种初始化块:   静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别   静态初始化块 定义:       ...

  4. 机器学习第2课:单变量线性回归(Linear Regression with One Variable)

    2.1  模型表示 之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示: 我们将要用来描述这个回归问题的标记如下: m                代表训练集中实 ...

  5. 排序效率小PK

    上个小demo看看 import com.google.common.primitives.Chars; import java.util.*; /** * java中数组转List使用Arrays. ...

  6. CKEditor+SWFUpload实现功能较为强大的编辑器(三)---后台接收图片流程

    在前台配置完CKEditor和SWFUpload之后就可以满足基本的需求了 在这里,我配置的接收异步上传的图片的页面为upload.ashx 在这个ashx中对上传的图片处理的流程如下: contex ...

  7. ANGULARJS: UNDERSTANDING DIRECTIVE SCOPE

    https://www.3pillarglobal.com/insights/angularjs-understanding-directive-scope --------------------- ...

  8. 【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  9. XJTU Summer Holiday Test 1(Brackets in Implications-构造)

    B - Brackets in Implications Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  10. XP如何在桌面新建宽带连接的快捷方式

    1 打开控制面板,点击网络和Internet连接 2 如果存在宽带连接选项. 则点击左侧的网上邻居,然后点击查看网络连接 右击宽带连接,点击创建快捷方式,放到桌面,改一下快捷方式的名字即可.   3 ...