【发布时间】:2015-10-27 17:16:03
【问题描述】:
我们如何使用 mqtt 协议和 kafka 作为消息代理?
客户端(android/ios/desktop java 应用程序等)将使用 mqtt phao 客户端库生成和使用消息,这些客户端库使用 kafka 作为消息代理以不同的语言提供。
有什么建议吗?
【问题讨论】:
标签: architecture rabbitmq scalability apache-kafka mqtt
我们如何使用 mqtt 协议和 kafka 作为消息代理?
客户端(android/ios/desktop java 应用程序等)将使用 mqtt phao 客户端库生成和使用消息,这些客户端库使用 kafka 作为消息代理以不同的语言提供。
有什么建议吗?
【问题讨论】:
标签: architecture rabbitmq scalability apache-kafka mqtt
这不是一个好主意。 MQTT 客户端通常非常轻量级且资源有限。这些设备或物联网具有较小的内存/CPU 能力。 Kafka 客户端通常是重量级的。例如,Kafka 客户端必须跟踪偏移量。它还需要与 Zookeeper 进行交互。简而言之,Kafka 不适合作为 MQTT 代理。您最好选择流行的 MQTT 代理,例如 Mosquito。
【讨论】:
您可以使用 Kafka 源连接器,它将数据从 Mosquitto 等 MQTT 代理流式传输到 Kafka 集群。见https://github.com/evokly/kafka-connect-mqtt
运行连接器的最简单方法是在独立模式下,其中单个实例将在单个节点上的 Kafka 集群上运行。您还可以在分布式模式下运行它(尽管配置更多),这将在集群中分布连接器以获得更大的吞吐量。在分布式模式下,您可以设计一个允许水平扩展、并行吞吐量和高可用性的拓扑。实施额外的保证需要额外的负载均衡器、多个 MQTT 代理以及遗嘱和遗嘱场景来处理连接器崩溃,但这可能超出了这个问题的范围。
使用连接器方法具有 Kafka 集群的优势,可确保您的连接器处于活动状态并在必要时重新启动它。分布式模式提供了更多优势。
【讨论】:
AFAIK,Kafka 没有“官方”MQTT 连接器。但是您可以使用 MQTT-Kafka 桥接器。如需灵感,请查看https://github.com/km4rcus/mqttKafkaBridge(请注意此实现中有一个错误:kafka 主题不能包含“/”,因此您可能希望在 Bridge.java 文件中的 messageArrived 中将它们替换为“_”)
请注意,此代码只是一个非常简单的解决方案,不可扩展。编写自定义实现以更好地满足您的期望可能是一个好主意。但是你应该让它尽可能简单——这是一个单点故障。只要您将数据输入 Kafka,您就可以获得一些保证,但您无法从 MQTT 代理那里获得任何保证。当桥梁崩溃时,您只是在丢失数据......
【讨论】:
正如@Miroslav Prymek 所提到的,没有官方的桥梁。这个是由 Jacklund 创建的。我已升级网桥以支持 Kafka v 0.8.1.1。还包含与 JRE 1.7 兼容的预构建二进制文件。这是MQTT Kafka Bridge的链接。
【讨论】:
您可以使用Mosca,这是一个用 javascript 编写的 mqtt 适配器。
Mosca 是一个 node.js mqtt 代理,可以独立使用或嵌入到另一个 Node.js 应用程序中
Mosca 支持 redis 和 mongodb 等不同的后端,也支持 kafka。 Kafka MQTT Bridge 应用程序是included in the Mosca examples。
This article on linkedin 更全面地描述了解决方案。
免责声明:我是 Mosca Kafka Bridge 示例应用程序的贡献者。
【讨论】: