MQTT 代理和 Apache Kafka 有啥区别

Posted

技术标签:

【中文标题】MQTT 代理和 Apache Kafka 有啥区别【英文标题】:What is the difference between MQTT broker and Apache KafkaMQTT 代理和 Apache Kafka 有什么区别 【发布时间】:2016-09-20 09:12:06 【问题描述】:

我正在开发一个移动消息应用程序。我正在研究所需的技术,并找到了两个 MQTT 和 Apache Kafta。对我来说,两者似乎都以同样的方式做同样的事情(在订阅和发布主题方面)。

我听说 MQTT 非常轻巧,适合手机使用?那么基本上这两者有什么区别,各有什么优势呢?

【问题讨论】:

*** 不是要求比较技术的场所 【参考方案1】:

Kafka 背后的主要动机是可扩展性。

MQTT 是一种具有公共规范的协议,用于轻量级客户端/消息代理通信,允许发布/订阅交换。存在多个客户端库和代理(Mosquitto、JoramMQ...)的实现并且几乎是兼容的。 MQTT 只指定了传输,模糊地指定了应用程序部分(即如何处理和可能存储数据,如何授权客户端......)。规范不清楚主题上消耗的数据是否只是实时的或可能是持久的。该规范没有说明实现 MQTT 的消息代理可以/应该如何扩展。

另一方面,Apache Kafka 是一个基于内部“提交日志”的消息代理:它的重点是在磁盘上存储大量数据,并允许实时或稍后消费(只要数据在磁盘上仍然可用)。它被设计为可部署为多个节点的集群,具有良好的可扩展性。 Kafka 使用自己的网络协议。

所以你在这里比较两个不同的东西:一个标准的 pub/sub 协议(具有多种实现),以及一个特定的消息存储/分发软件,同族的 vaguley 有自己的协议。

我想说,如果您需要存储大量消息,以确保批处理,请多看 Kafka。如果您有大量客户端/应用程序在许多独立主题上实时交换消息,请查看更多 MQTT(甚至 AMQP)消息代理实现。

【讨论】:

kafta 是 whatsapp 等移动应用消息传递的理想选择吗? 我为什么问,因为我知道 MQTT 是 light weight 并且占用空间小,非常适合移动设备。那么卡夫塔呢? 它只是相似的,不仅是 mqtt,它们对于那些用例来说是更相似的协议。我也依赖mqtt。 一切都与能力有关,kafka 没有内置 msg 优先级,安全性差,协议繁重。在移动应用程序上暴露 kafka 需要一些工作,这通常是通过在顶部添加一个休息层来完成的。 MQTT 可以解决这些问题......但现在反过来了,kafka 的扩展性比我玩过的所有 mqtt impl 都要好...... 回复:its focus is storing massive amounts of data on disk:您也可以在 MQTT 中启用数据持久性。所以存储数据不能成为使用 Kafka 而不是 mqtt 的理由。卡夫卡一定有其他优势?!【参考方案2】:

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

这就像比较苹果和橘子,两者存在的原因截然不同。

我在 IoT 环境中看到的大多数用例都结合了 MQTT 和 Apache Kafka。边缘设备使用 MQTT 协议(因为它在边缘环境中具有优势。然后将它们转发到 Apache Kafka 以将事件传递到企业架构的其余部分。

您可以通过 MQTT 代理(如 HiveMQ + Apache Kafka)或通过 MQTT 代理(这样您就不需要 MQTT 代理)来执行此操作。当然,这两种选择都有取舍。

看到这个example of how to combine MQTT with Apache Kafka。或者直接上Github代码:“Deep Learning UDF for KSQL for Streaming Anomaly Detection of MQTT IoT Sensor Data”。

我还创建了一个关于如何集成Apache Kafka and MQTT 的现场演示。

【讨论】:

有趣。感谢您的洞察力。 NVIDIA 似乎直接在他们的 jetson 设备上推广使用 kafka 来通过 WAN 将数据发送到服务器。你也会推荐吗?还是将 MQTT 步骤从 jetson 设备插入服务器更有意义?

以上是关于MQTT 代理和 Apache Kafka 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

技术资讯 | Apache Kafka携手MQTT 的IoT思路

Apache Activemq 和 Mqtt

Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区

Kafka 分区和 Kafka 副本有啥区别?

kafka 和 kafka-clients 有啥区别?

日志采集系统flume和kafka有啥区别及联系,它们分别在啥时候