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 ...
随机推荐
- 【Linux】Linux下 环境变量/etc/profile、/etc/bashrc、~/.bashrc的区别【转】
转自:http://blog.csdn.net/qiao1245/article/details/44650929 ------------------------------------------ ...
- JAX-WS编写webservice
1.新建一个Java工程 2.创建要发布的类 package com.linjian.webservice; import javax.jws.WebMethod; import javax.jws. ...
- 【Java】String和Date、Timestamp之间的转换
首先,定义一个Format的日期格式: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 一.S ...
- DevExpress控件之popupMenu
一.首次创建 1.可直接从工具栏拉一个PopupMenu出来, 2.右键Customize,Yes(提示是否自动创建BarManager,并为popupmenu绑定这个BarManager): 3.编 ...
- C++基础学习教程(一)
開始自己的C++复习进阶之路. 声明: 这次写的博文纯当是一个回想复习的教程.一些非常基础的知识将不再出现.或者一掠而过,这次的主要风格就是演示样例代码非常多~~~ 全部代码在Ubuntu 14.04 ...
- JMS 在 SpringBoot 中的使用
当前环境 Mac OS 10.11.x docker 1.12.1 JDK 1.8 SpringBoot 1.5 前言 基于之前一篇“一个故事告诉你什么是消息队列”,了解了消息队列的使用场景以及相关的 ...
- VB断点调试
最近都在敲机房收费系统,这个系统是我们第一次自己在没有源代码的情况下进行的系统. 写程序的时候逻辑非常重要,可是我们还要清楚非常多时候你以为的并非你以为的! 就像在敲机房的时候,我们明明理清了逻辑.并 ...
- LoadRunner读取关联数组的个数和内容
web_reg_save_param_ex( "ParamName=response_header1", "LB=Set-Cookie: ", "RB ...
- wps文档忘记保存关闭了怎么恢复
wps文档忘记保存关闭了怎么恢复 点击程序左上角的''WPS文字/表格/演示''选择备份管理,根据需要尝试右侧下面的"查看其他备份"功能就能找了. 点击"开始-运行&qu ...
- 虚拟机只有IPv6,没有ipv4
1.修改配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none HWADDR=00:0C:29:20: ...