项目背景
物联网项目,硬件端通过TCP协议连接服务端,自行设计的通信协议(没有走通用的如MQTT等协议),所以需要一层网关,来负责服务端和业务端的通信。(注:此项目是2020年上半年开始计划重构)
网关需求
- 负责和设备端建立TCP连接,充当业务端和设备端的通信桥梁
- 支持并高发(当前设备数3W左右,单向下发的消息500条/秒,目标是可支持到50W+,单向下发支持到2W+条/秒)
- 限流,熔断,IP黑名单
- 通信协议解析
- WEB端接口(后台可强行设备断开连接等)
技术选型
PHP
- 优势
- 我们团队的技术栈是以PHP为主,目前业务端采用的框架是swoft2(关于swoft的问题,也可以私我,也经常在swoft群里,欢迎一起来吹水)
- swoole直接撸,成功案例还是多的,写起来也不陌生
- 不足
- swoole版本升级的有点快,文档略不足,前人踩过的坑相对比较多,有点慌
JAVA
- 优势
- 完整的体系,拿起来就能用(netty等)
- 不足
- 非java体系出身,怕遇到坑
- 似乎java的理念就并非小而美,而是完整的工程学
GOLANG
- 优势
- 有个好爹,网络开发利器,官方文档丰富,内置功能丰富
- 小而美的代表
- 不足
- 简单易用的三方框架少
经过对比,最终选择了网络开发的C语言--golang
也没有选择golang的三方包,主要是核心功能并不是特别复杂,官方提供的包足够应付。再者,要对三方包很熟悉,否则一出问题,无法在短时间内解决,对项目而言,是巨大的风险。
解答疑惑
-
为什么是选择TCP协议,而不是UDP协议?
答:tcp是安全可靠的面向连接双工通信的协议,硬件端和服务端的通信,正好需要这些功能。而udp协议虽然简单,但是不适合在这样的场景下(如:udp适合dns的时候使用)
-
为什么选择直连TCP,而没有选择如MQTT等通用协议?
答:这是个历史遗留问题,最开始硬件端设计的时候,就是只考虑了TCP直连,且我们自定义了一套效率较高的通信协议。MQTT等协议,底层也是基于TCP协议,无外乎就是提供了类似队列的一种通信机制,中间多了很多过程,而我们追求的是更快速的响应,所以选择TCP直连,其他的都自己来撸。