Karma 是一个生产便携式WiFi热点设备的公司,近日,其在官方博客上发布了一篇 文章 ,介绍了它们如何使用MQTT协议代替HTTP协议来应对WiFi设备的增长。
Karma生产的WiFi热点设备因为需要收集信息以及一些功能,每一台设备都需要定期发送一些数据到Karma后端。在 之前 ,Karma使用HTTP+TLS来传输数据,但随着卖出设备越来越多,它们需要对这一部分进行优化以减轻带宽和后端的压力,于是它们想到了MQTT。
MQTT 是IBM提出的一项轻量级消息协议,它针对物联网设计,用于轻量级的pub/sub式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。Karma使用MQTT将之前的JSON数据包转为二进制buffer数据,大大减少了传输数据的体积。
在采用MQTT前,它们首先定义了自己的需求,Karma对于MQTT服务端的需求如下:
对于Karma这样的高可用和可扩展的需求,截至2014年底,并没有一个成熟且合适的MQTT服务端解决方案能够满足,Karma只能自己研发,于是他们推出了MQTTParty,这个命名是对经典的Ruby开源库 HTTParty 致敬。
MQTTParty使用Go语言编写,Go语言的性能强劲,并且有内建的并发支持,对于消息中间件来说是理想的开发语言。MQTTParty可以分布式的部署,并且彻底的无状态,单机宕掉对服务无影响,状态使用Redis来存储。但这给前面的负载均衡提出了难题,因为Karma的设备和后端之间保持一个TCP长连接,而一般的负载均衡只需要支持HTTP短连接即可,最终Karma采用HAProxy的最小连接均衡算法解决了这个问题。
最终,Karma的新后端架构如下图:
MQTTParty在其中起到接受发送数据,以及转换MQTT和HTTP数据的作用。当后端需要发送数据到终端设备时,它会检查Redis中该设备是否连接到后端,然后接受HTTP信息转为MQTT数据传送给终端设备。
Karma在发布该文章时并未将MQTTParty开源,因为它与Karma其它后端集成过于紧密,后续它们会将它MQTTParty剥离出来并开源。对这个项目感兴趣的读者也可看看最近发布的一个类似的开源项目 VerneMQ ,它也适用于Karma所面临的问题。