边缘服务器采用了容器和微服务架构,其中重要的一个方面就是要选择一个高效率的消息系统,用于微服务之间的消息交换。

为什么选择websocket 协议

 modular-2 edge 设计了自己的消息系统base service ,它采纳了websocket协议。为什么选择websocket? 主要是基于如下考虑:

在一个边缘设备中,消息系统需要解决两方面的通信:

  1. app 和web 网页之间的双向通信
  2. app 和base service 之间的双向通信

websocket是建立在tcp 协议上的,由http 协议通过升级方式建立websocket。所有一般说来,websocket 的传输效率肯定没有tcp 高。

  但是,在边缘设备中,用户界面是通过web 网页实现的,在HTML5的控制面板上实时显示数据为了避免不断地polling ,需要一种双向通信协议,在web 服务器中比较多的是采用socket.io,而socket.io 正是基于websocket的 .

,baseservice 统一采用了websocket 作为消息系统的协议.

为什么不用MQTT?

同事向我提议”为什么又不采用MQTT协议呢?”,我也知道许多的边缘设备采纳MQTT作为消息总线.而且云端应用中也使用基于pub/sub 的消息系统.毕竟采纳现成的系统会可靠一点。网络上对MQTT的处理能力也大势宣传。

于是,我花了一段时间测试了基于MQTT 消息系统的微服务通信。

IO 模块(我们称为microserver) 上使用的paho MQTT embedded C client。MQTT 代理使用mosquitto 。App 采用C++ paho MQTT client 代码。

测试的结果表明 MQTT 对于短小,低速的IOT 消息交换是可行的,但是如果是高速的大数据流,MQTT 的传输速度不快,我测试的结果是网络传输速率大约2 Mbps 左右.而且mosquitto 占用CPU 的时间也比较大.

也许MQTT代理 对于巨量客户端的消息交换又不俗的表现,但是对于少量,实时高速数据而言,好像没那么好.

想想也是,MQTT 可以在websocket 上传输,实际上如果在web 网页中使用MQTT 的话,必需使用MQTT over websocket 方式(9100端口)。这时,MQTT和websocket 的关系就好比苹果和篮子的关系了。

二进制编码的UDP 效率最高

在baseservice 开发的早期,IO模块采用了UDP 协议,那是传输效率最高的.后来由于基于二进制编码的UDP 通信编程容易出错.我们放弃了.如果需要的化,还可以回到UDP.

疑问

kafka 这样的消息系统在小型边缘设备中的表现会是什么样的呢?

网络上,有老外说,MQTT 最好,不到万不得已,不要使用websocket ,但是许多事情需要自己实验了,才指定是否合适.当然不同场景,也各有不同.对于低速iot 而言,MQTT 是好的选择.

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐