不积跬步,无以至千里;不积小流,无以成江海。
大家好,我是闲鹤,公众号 xxh_zone,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了7年多,主要从事物联网/车联网相关领域和业务。
喜欢交友、骑行、写毛笔字、弹吉他、折腾硬件和写代码。
之前写了一篇《百万级物联网框架设计》里面有涉及到 Dispatch Server
的设计,这个 server 的主要功能是起着均衡的作用,对 IOT 终端进行分发,让其分别连接到不同的 Session Server(One) 上,这个设计主要是借鉴了当年在华为和迅雷相关的开发经验。本篇,我们就来聊聊它的框架设计。
在华为的学习
10年9月进入华为,当时是在华为的无线-网管部,团队主要是负责华为无线终端-网管侧的开发:电信基站中的一些传感器采集温度、风度等信息,通过通讯模块(那时还是2G,现在都4G了)上报给网管侧(云端,那时“云”这个词还刚刚被“发明”出来),网管侧进行数据存储、分析、报警和可视化。那时团队划分的很细,每个模块为一个开发小组,大致的团队结构为:
- 配置组(Java开发):大致为UI(那时用的桌面软件,java开发)界面的一些数据展示配置、服务相关的配置,同时涉及到数据的的存储,是整个系统的存储和展示层。
- 接入组/组网(C/C++开发):负责终端设备的接入和维持通讯;当时的接入又分为:
- 网关接入:使用2G,走TCP网络,这是主要方式。
- 短信Modem接入:使用短信接入,通过收-发短信与终端设备进行通讯。
- 测试和产品。当时他那个自动化测试-部署感觉很牛逼,好像是叫
ant
。
大致框架如下图:
在华为的几年,就主要负责 Dispatch Server
和 Msg Modem
的开发。当时我记得工作了好几个月都不知道整个系统是干嘛的,给谁用的。只是到后面,接触多了,慢慢的对整个系统有一定的了解了。(如今14年过去了,还经常会梦到之前的那些同事,那是我走向社会的第一站,是我的第一任社会老师们。)
Dispatch Server 的践行
从18年创业接触到目前的这个项目(官网)就一直致力于维持、维护云平台的稳定、高并发、易扩展,于是就把华为的这套 Dispatch 借鉴到当前的项目中了。
起因
当时开发出 One
(相关阅读) 后,终端设备全部通过 TCP 与 One 保持长链通信,终端是通过域名寻址到 One 的,如果一个 One 扛不住,可以横向启动多个 One 。但是这样通过域名的方式进行负载的话,会有这么几个问题:
- 新加入的 One,域名不能得到及时的更新增加
- 要删除的 One,域名不能得到及时的更新删除
- 不能人为的设定 One 所要负载的终端数量,即,控制不了每个单体 One 的负载数量
于是,我就把之前在华为的那一套借鉴过来了,新建了一个 Dispatch
服务,连这个名字也是与华为的保持一致。
解决问题
Dispatch Server 的引入,就是为了解决由域名负载所不能解决的问题:
- 随时增加和删除 One,终端都能连接到合适的 One Server
- 可人为的更改 One 负载的权重
- 可以隐藏 One 的 ip 和 port,在一定程度上免受恶意攻击
实施
框架图:
这里的 Session Server
即为 One
设备与 Dispatch Server 的数据交换格式:
请求协议格式:
标识位 | 终端类型 | 终端厂家 | 设备编号长度 | 设备编号 | 标识位 |
---|
标识位:1字节
终端类型: 1字节
终端厂家:1字节
设备编号长度:1字节
设备编号:BCD,长度由设备编号确定
响应协议格式:
标识位 | Session IP | Session Port | 标识位 |
---|
Session IP:4字节
Session Port:2字节
结尾&导读
至此,Dispatch Server 的基本功能就介绍完了,当然在实际生产过程中,可根据自己实际的应用场景进行更改,可以做到 nginx 一样的负载均衡的效果(当然 nginx 的负载是在 http/https 层的,与物联网通信是在 tcp 层的,目前 nginx 好像还不支持)。之前用了阿里云的 SLB,他这个比起 nginx 功能更强大,可以对后端的 Server 进行 alive 判断和错误判断。如果自己简单实现的也是可以的,就是对每个 server 增加了类似心跳和返回错误率的判断。
相关阅读:
不积跬步,无以至千里;不积小流,无以成江海。
大家好,我是闲鹤,公众号 xxh_zone,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了7年多,主要从事物联网/车联网相关领域和业务。
喜欢交友、骑行、写毛笔字、弹吉他、折腾硬件和写代码。
个人博客: https://blog.uwenya.cc/
公号: