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. 使用ARC也可能发生内存泄露

    1,循环参照 A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放. 这种问题常发生于把delegate声明为strong属性了. 例, @interface Samp ...

  2. SQL数据库学习系列之一

    数据库知识的重要性不言而喻,以下链接给出了最最基础知识的讲解. 第一讲:SQL 语法 第二讲:SQL SELECT 语句 第三讲:SELECT DISTINCT 语句 第四讲:SQL WHERE 子句 ...

  3. 【IntellJ IDEA】idea启动测试类报错Error running 'Test1.test': Command line is too long. Shorten command line for Test1.test or also for JUnit default configuration.

    idea启动测试类报错 Error running 'Test1.test': Command line is too long. Shorten command line for Test1.tes ...

  4. 跟着Sedgewick学算法(week 1 UnionFind)

    发现笔记转过来,没有图的~~~~~~~~~~~悲剧,给出共享笔记链接 https://www.evernote.com/pub/yanbinliu/algorithm 很久之前就在coursera看到 ...

  5. jq和js中click 事件的几种方式总结和click事件的累加问题解决办法

     1:常见的三种绑定click事件: 第一种:$("#click").click(function(){ alert("Hello World  click") ...

  6. flask的session解读及flask_login登录过程研究

    #!/usr/bin/env python # -*- coding: utf-8 -*- from itsdangerous import URLSafeTimedSerializer from f ...

  7. 怎样从server获取图片

    今天写了安卓程序与server通信.当中须要从server获取图片.本来以为下载流.处理文件流非常复杂.结果几句话就轻松搞定了.如今记在这里. // (2014.5.1第一种方法)通过server返回 ...

  8. ES6中的Map集合(与java里类似)

    Set类型可以用来处理列表中的值,但是不适用于处理键值对这样的信息结构.ES6也添加了Map集合来解决类似的问题 一.Map集合 JS的对象(Object),本质上是键值对的集合(Hash结构),但是 ...

  9. spring-hadoop-samples

    官方的spring-hadoop-samples的demo 写的还是挺好的,值得学习. 官网地址: http://projects.spring.io/spring-hadoop/#quick-sta ...

  10. 【Hadoop】Hadoop MR 性能优化 Combiner机制

    1.概念 2.参考资料 提高hadoop的mapreduce job效率笔记之二(尽量的用Combiner) :http://sishuo(k).com/forum/blogPost/list/582 ...