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)

最新文章

  1. CapsLock与ctrl的键位修改
  2. xxx is not in the sudoers file.This incident will be reported.的解决方法 (一般用户不能执行sudo)
  3. WinForm------GridControl显示每行的Indicator中的行号
  4. DSP using MATLAB示例Example3.16
  5. 文档大师 搜狗拼音无法输入汉字_乱码的解决方法_VB6程序
  6. hdu 4758 Walk Through Squares
  7. php 之 数据访问 增删改查
  8. append, appendTo, after区别(preappend、before与这几个原理相同)
  9. selenium webdriver 学习笔记(一)
  10. 如何在windows的DOS窗口中正常显示中文(UTF-8字符)
  11. 新唐M0特点分析
  12. therefore/so/hence/then/accordingly/Thus
  13. Lamda Action Func Thread 实例
  14. 关于spring autowrie的5种方式
  15. 诡异的php 输出缓冲
  16. Angular 小试牛刀[1]:Getting Started
  17. 统一流控服务开源-1:场景&业界做法&算法篇
  18. 解决无法打开myeclipse-->“The default workspace'D: /myeclipse spaceis in use or cannot be created. Please choose a different one”
  19. 【Spark篇】---SparkSQL初始和创建DataFrame的几种方式
  20. jQuery之事件和批量操作、事件委托示例

热门文章

  1. C语言基础之注释与常见错误
  2. 【MySQL性能优化】MySQL常见SQL错误用法
  3. jq和js中click 事件的几种方式总结和click事件的累加问题解决办法
  4. [置顶] kubernetes--Init Container
  5. Hive错误记录
  6. CentOS 7.2通过yum安装zabbix
  7. 数据库中存在0,1,2.....或者1,null,2 排序时让0或者null在最后的sql语句
  8. 使用PowerDesigner进行代码生成
  9. 2. Spring Boot返回json数据【从零开始学Spring Boot】
  10. 【Android工具类】怎样保证Android与server的DES加密保持一致