大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

Karma 如何使用 MQTT 应对日益增长的 WiFi 设备

  • 2015-08-25
  • 本文字数:900 字

    阅读完需:约 3 分钟

Karma 是一个生产便携式 WiFi 热点设备的公司,近日,其在官方博客上发布了一篇文章,介绍了它们如何使用MQTT 协议代替HTTP 协议来应对WiFi 设备的增长。

Karma 生产的 WiFi 热点设备因为需要收集信息以及一些功能,每一台设备都需要定期发送一些数据到 Karma 后端。在之前,Karma 使用HTTP+TLS 来传输数据,但随着卖出设备越来越多,它们需要对这一部分进行优化以减轻带宽和后端的压力,于是它们想到了MQTT。

MQTT 是 IBM 提出的一项轻量级消息协议,它针对物联网设计,用于轻量级的 pub/sub 式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。Karma 使用 MQTT 将之前的 JSON 数据包转为二进制 buffer 数据,大大减少了传输数据的体积。

在采用 MQTT 前,它们首先定义了自己的需求,Karma 对于 MQTT 服务端的需求如下:

  • 尽可能的无状态
  • 可扩展的,能够提供连接池
  • 能够与终端设备以 HTTP 交互
  • 希望是开源的,以便深入源码

对于 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 所面临的问题。

2015-08-25 19:003078
用户头像

发布了 164 篇内容, 共 117.3 次阅读, 收获喜欢 392 次。

关注

评论

发布
暂无评论
发现更多内容

maven私服搭建

kcnf

maven

《零基础学Java》 FAQ 之 2-Java版本那点事儿

臧萌

Java

Java并发编程基础--volatile

Java收录阁

volatile 线程

Redis学习笔记(字符串类型)

编程随想曲

redis

书籍推荐

蛤蟆先生

读书

Kubernetes 将迎来首个 LTS 版本

倪朋飞

Kubernetes 容器 微服务

pip 配置路径要死记硬背?

风起帆扬了

Python Linux windows pip

一次生产事故导致系统崩溃的原因排查过程

hellocj

程序员大佬怎么跳槽?

程序员干货站

Python 人工智能 程序员 后端

聊聊我的程序员下属

程序员干货站

Python 人工智能 程序员 程序人生

利用goaccess分析nginx日志

Megatron7

nginx Linux

Graylog部署文档

勤而行之

Linux 开源 工具 日志分析

取舍与可测试

孙苏勇

产品 产品设计 产品开发

Flutter引擎源码解读-内存管理篇

Geek_70xtik

flutter ios android 跨平台 dart

JAVA 程序展示时间与数据表保存的时间相差了 13 个小时!

我不自豪谁志豪

MySQL 学习 后端

如何在“写作平台”做一个读者

小天同学

思考 写作平台 建议 读者 阅读量

低代码是什么鬼

Jeff Kit

低代码 全栈 开发

一次线上服务高 CPU 占用优化实践

挖坑的张师傅

性能优化 JVM cpu

《零基础学Java》 FAQ 之 1-HelloWorld程序发生了ClassNotFound错误怎么解决

臧萌

Java Hello World !

有节制的设计

胖鱼2号

微信 设计 無印良品

七大查找算法,面试考试皆可用

我不自豪谁志豪

Java 面试 算法

Bash 的4种运行模式

Megatron7

bash Linux DevOps Shell

快捷考勤打卡设置

Megatron7

ios

字节流(InputStream/OutputStream)

Howe

Java 工作流

python 之 「奶茶名字」的词云展示

小匚

Python python 爬虫 python教程

理解 KL 散度的近似

Neil

人工智能 学习 Deep learning Machine Learning

我们有来生吗?

Janenesome

读书 碎碎念 猎奇

1分钟系列-Elastic Stack(ELK)简介

Yezhiwei

Logstash Kibana ELK

乞丐版英制单位转换

escray

学习 CSD 认证实战营

面试考试可用,十大排序算法

我不自豪谁志豪

学习 面试 算法

回"疫"录(8):我怀疑我病了

小天同学

疫情 心理 回忆录 现实纪录 纪实

Karma如何使用MQTT应对日益增长的WiFi设备_语言 & 开发_徐川_InfoQ精选文章