代码改变世界

MQTT协议是什么?MQTT和Kafka的联系与区别

2023-10-11 17:24  古兆洋  阅读(107)  评论(0编辑  收藏  举报

转自:https://www.sohu.com/a/656717240_121147809

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,诸如 EMQX已经实现了MQTT broker与Kafka的桥接。MQTT broker用来快速的对大量物联网设备发来的消息做接收处理响应,而Kafka对这些大量的数据做采集存储,交给数据分析人员来分析处理消息。