MQTT代理和Apache Kafka之间有什么区别?

60

我正在开发一款移动消息应用程序。我正在查阅所需的技术,发现了两个MQTT和Apache Kafta。对于我来说,两者在订阅和发布主题方面似乎都是以相同方式进行的。

我听说MQTT非常轻量级,适合移动端?那么,这两者之间有什么区别,各自的优势是什么?


1
Stackoverflow不是询问技术比较的场所。 - hardillb
2个回答

70
Kafka 的主要动机是可扩展性。
MQTT 是一种公开规范的协议,用于轻量级客户端/消息代理通信,允许发布/订阅交换。存在多个客户端库和代理实现(如 Mosquitto、JoramMQ 等),并且基本上是兼容的。MQTT 仅指定传输方式,并模糊地指定应用程序部分(即数据如何处理和可能存储、授权客户端的方式等)。规范不清楚在主题上消耗的数据仅为实时还是可能是持久性的。规范未说明实现 MQTT 的消息代理如何扩展。
另一方面,Apache Kafka 是一种基于内部“提交日志”的消息代理:它专注于在磁盘上存储大量数据,并允许实时或稍后使用(只要数据仍然可用于磁盘)。它被设计为多节点集群部署,具有良好的可伸缩性。Kafka 使用其自己的网络协议。
因此,您在比较两件不同的事情:一个标准的发布/订阅协议(具有多个实现),以及一个特定的消息存储/分发软件,与其自己的协议模糊相似。
我会说,如果您需要存储大量消息以确保批处理,请更多地关注 Kafka。如果您有许多客户端/应用程序在许多独立主题上实时交换消息,请更多地查看 MQTT(甚至 AMQP)消息代理实现。

卡夫塔是否适合移动应用程序消息传递,例如WhatsApp? - Manish Kumar
1
它们仅是相似的,不仅仅有 MQTT 这一种协议适用于这些情况。我也依赖 MQTT。 - Samrat Das
3
关键在于能力,Kafka 并没有内置消息优先级、安全性差且协议重。在移动应用中暴露 Kafka 需要投入一些工作,通常通过在其上添加 REST 层来完成。MQTT 可以解决这些问题...但它的反面是,Kafka 比我使用过的所有 MQTT 实现都具有更好的可扩展性... - Olivier Refalo
回复:“它的重点是在磁盘上存储大量数据”:您也可以在MQTT中启用数据持久性。因此,存储数据不能成为使用Kafka而不是mqtt的原因。 Kafka必须有其他优势?! - ttfreeman
@ttfreeman 不可以使用MQTT存储数据。MQTT的持久性仅用于内部,以提供对QOS级别> 0的重启或网络故障的支持,以确保传递。它不是用来存储数据以重建提交日志的。在MQTT上,您只能(功能上)存储最后一条消息,如果保留标志为true,则可以这样做。您无法访问以前的消息以进行任何用户预期使用。 - pdenti
显示剩余2条评论

30

MQTT是一种标准协议(有许多实现方式)。Kafka(也是一个协议)通常通过从Apache网站或例如Confluent Docker镜像下载来使用。

这就像比较苹果和橙子,两者存在的原因非常不同。

我在物联网环境中看到的大多数用例都是将MQTT和Apache Kafka结合使用。边缘设备使用MQTT协议进行通信(因其在边缘环境中的优势)。然后将其转发到Apache Kafka中,以将事件传递到企业架构的其他部分。

您可以通过MQTT Broker(例如HiveMQ + Apache Kafka)或通过MQTT Proxy(这样您就不需要MQTT Broker)来执行此操作。当然,两个选项都有权衡。

请参见此示例,了解如何将MQTT与Apache Kafka结合使用。或直接转到Github代码:“用于流媒体MQTT IoT传感器数据的KSQL深度学习UDF的异常检测”。

我还创建了一个关于如何集成Apache Kafka和MQTT的实时演示。


有趣。感谢您的见解。NVIDIA似乎在其Jetson设备上直接推广使用kafka将数据发送到服务器的WAN。您会推荐这样做吗?还是将MQTT步骤从Jetson设备插入到服务器更有意义? - Blafasel42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接