MQTT 与 Kafka

MQTT 与 Kafka 是完全不同的两个东西, MQTT 是协议,是一个技术标准,由 OASIS 技术委员会的成员(其成员多数为 IBM 和微软的顶级工程师)制订。而 Kafka 是已经实现的开源流处理平台,最早由 LinkedIn 开发,于2011年开源后交给 Apache Incubator 孵化后成为了 Apache 软件基金会的顶级项目。

两者之前唯一存在的联系恐怕就是它们都和发布/订阅范式有关了吧。MQTT 是基于发布/订阅范式的消息协议,而 Apache Kafka 的生产、消费的流程也是属于发布/订阅范式的。那么如果我们基于 MQTT 协议去实现一个消息 broker ,是否这个 MQTT broker是否能和 Kafka 作用等价呢? 答案当然是否定的!

Kafka 虽然也是基于发布订阅范式的消息系统,但它同时也被称为“分布式提交日志”或者“分布式流平台”,它的最主要的作用还是实现分布式持久化保存数据的目的。Kafka 的数据单元就是消息,可以把它当作数据库里的一行“数据”或者一条“记录”来理解,Kafka 通过主题来进行分类,Kafka 的生产者发布消息到某一特定主题上,由消费者去消费特定主题的消息,其实生产者和消费者就可以理解成发布者和订阅者,主题就好比数据库中的表,每个主题包含多个分区,分区可以分布在不同的服务器上,也就是说通过这种方式来实现分布式数据的存储和读取, Kafka 分布式的架构利于读写系统的扩展和维护(比如说通过备份服务器来实现冗灾备份,通过架构多个服务器节点来实现性能的提升),在很多有大数据分析需求的大型企业,都会用到 Kafka 去做数据流处理的平台。

而 MQTT 最开始就是为物联网设备的网络接入而设计的,物联网设备大多都是性能低下,功耗较低的计算机设备,而且网络连接的质量也是不可靠的,所以在设计协议的时候最需要考虑的几个重点是:

  1. 协议要足够轻量,方便嵌入式设备去快速地解析和响应。
  2. 具备足够的灵活性,使其足以为 IoT 设备和服务的多样化提供支持。
  3. 应该设计为异步消息协议而非同步协议,这么做是因为大多数 IoT 设备的网络延迟很可能非常不稳定,若使用同步消息协议,IoT 设备需要等待服务器的响应,对于为大量的 IoT 设备提供服务这一情景,显然是非常不现实的。
  4. 必须是双向通信,服务器和客户端应该可以互相发送消息。

MQTT 协议完美地解决了上述几点要求,并且最新版的 MQTT v5.0 协议做了很多优化,使其协议相比过去的 v3.1.1 版本具备更强大的灵活性以及对带宽的更少占用。

要说基于 MQTT 协议的消息 broker 和 Kafka 的区别的话,EMQ 君认为还是在于它们的侧重点不同,Kafka 的侧重点在于数据的存储和读取,针对实时性比较高的流式数据处理场景;而 MQTT broker 的侧重点在于客户端和服务器的通信。

MQTT broker 与 Kafka 所采用的消息交换范式是如此相近,将其两者结合起来使用显然是一个非常不错的主意,事实上,很多 MQTT broker,诸如 EMQ X 已经实现了 MQTT broker 与 Kafka 的桥接。MQTT broker 用来快速的对大量物联网设备发来的消息做接收处理响应,而 Kafka 对这些大量的数据做采集存储,交给数据分析人员来分析处理消息。

为流式数据存储和实时处理而生的流数据库

全托管的 MQTT 云服务,开始 180 天免费试用

推荐阅读

Python MQTT 异步框架 —— HBMQTT

本文我们将演示如何使用 Python MQTT 异步框架 - HBMQTT,轻松实现一个具备 MQTT 发布、订阅功能的异步 Demo。

MQTT 和 CoAP 在 EMQ X 世界的一次「约会」

本文将向你展示,MQTT 客户端和 CoAP 客户端,在 EMQ X World 的一次「约会」。

在树莓派上搭建智能家居网关

本文将使用 树莓派 + EMQ X Edge + EMQ X Kuiper 搭建智能家居网关,实现智能家居设备数据的边缘计算处理,减少家庭私密数据外流。