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思路
Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区