欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

TCP 网关背景和技术选择

最编程 2024-04-06 07:39:25
...

项目背景

物联网项目,硬件端通过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的三方包,主要是核心功能并不是特别复杂,官方提供的包足够应付。再者,要对三方包很熟悉,否则一出问题,无法在短时间内解决,对项目而言,是巨大的风险。

解答疑惑

  1. 为什么是选择TCP协议,而不是UDP协议?

    答:tcp是安全可靠的面向连接双工通信的协议,硬件端和服务端的通信,正好需要这些功能。而udp协议虽然简单,但是不适合在这样的场景下(如:udp适合dns的时候使用)

  2. 为什么选择直连TCP,而没有选择如MQTT等通用协议?

    答:这是个历史遗留问题,最开始硬件端设计的时候,就是只考虑了TCP直连,且我们自定义了一套效率较高的通信协议。MQTT等协议,底层也是基于TCP协议,无外乎就是提供了类似队列的一种通信机制,中间多了很多过程,而我们追求的是更快速的响应,所以选择TCP直连,其他的都自己来撸。

推荐阅读