"Guaranteed Delivery" 消息传递 - 我应该使用 MQTT 还是 ZeroMQ?

"Guaranteed Delivery" Messaging - should I use MQTT or ZeroMQ?

我们需要一个基于客户端的轻量级消息传递解决方案。我们之前用过AMQP,RabbitMQ,但是在C++中我们遇到了问题

我们想选择 ZeroMQ with malamuteserver 还是 MQTT?我们的物联网几乎每 5 分钟就会发布一次数据 (45 kb)。

我们需要 100% 传送此消息,不想丢失任何消息。

我们尝试了 MQTT QoS 级别 2,但是当服务器断开连接或主服务器客户端出现问题时,我们将丢失已发布的消息。

我们恰好需要 RabbitMQ 任务/工作者模型。如果发生任何事情,消息应该在服务器中排队直到消费者连接。

欢迎任何建议、指导和示例。

P.S.: 这将是生产环境,所以我们想选择问题较少的方式:)

A: We need to deliver this message 100% and do not want to lose any message.
B: Messages should queued in the server until consumers connected if anything happens.
C: This will be production so we want to choose a less problematic way :)

A: 可行
A: + B: 可行,更难,但仍然可行
A: + B: + C:不是,这个需求组合是有代价的

D: Any suggestion, direction and examples welcome.

ZeroMQ 随手可得,作为轻量级,毫无疑问,可调/可调整远远超出 [=39] 的引用吞吐量=]~ 45 [kb / 5 min],但魔鬼对 Zen-of-Zero 的强度有了正确的理解,包,原样,by design 努力提供零保修 并让所有类型的用户设计他们自己的、特定于用例的(读作 "just-enough"-保修需要,所以不会丢失一点世界其他地区用例的效率)。

因此,D: 花费了适当的设计努力来覆盖“成本”- of-C: 你已经达到了设计目标。

很简单,这是所有 CTO 面对这个问题并决定下一步的共同任务。

奖金部分

如果需要最小化物联网设备的要求,可以将这些 costs-of-C: 与类似的习惯进行比较- 改编更轻量级的可扩展正式通信模式原型框架,该框架由 Martin Sustrik 等人 设计,作为 ZeroMQ 的妹妹—— ,低功耗/稀缺资源可能会有所节省,这在大量物联网设备中很常见。

我认为 MQTT 被夸大了,当然我认为结果是由于可用的开源服务器。 Zeromq 确实提供了很多功能来构建满足要求的东西。我越看可用的选项,就越倾向于 zeromq。在我们的例子中,我们将以随机间隔从大量设备(网状网络中的网关或终端节点 themsevles)接收数据。我们最终确定的消息大小非常简单,一个分隔字符串,二进制编码,压缩(<100 字节)并通过网络发送。我决定在服务器上使用 zeromq 来接收消息。原因不仅基于 zeromq 作为代理,还在于我们如何利用其 curveZmq 功能来简化设备配置,并允许简单的 ZTP(零接触配置系统)和密钥可管理性。我在预设时间辩论使用 pub/sub 与推/拉模式,其中每个终端设备都是发布者或推送者,在云服务器上有代理订阅者。虽然通常在 pub/sub 中发布,但在典型的大规模 IOT 部署中,发布者更少,订阅者更多,发布者更多,订阅者更少,所以这让我想知道我是否应该选择 pub/sub 并且有由于订阅者加入速度慢而导致消息丢失的问题——如果我们关闭服务器进行维护怎么办,现场的设备将继续发布消息,直到达到 HWM。猜想总是存在丢失消息的风险,无论发生什么事——回程网络出现故障并且设备命中 HWM——这是无法控制的。

Malamute 没有太多文档,否则我会对其进行更多探索。

那么,您决定使用什么了吗?如果您想保留消息直到它们被使用,我强烈建议将 zeromq 作为代理,让工作人员将消息推送到持久存储中。您也可以在这里发挥创意,包括序列号等,并允许客户端请求给定的消息序列范围等,如果它们丢失了。

在现实世界中没有 'guaranteed delivery' 这样的事情,因为在很多层面上都可能出错:硬件、网络、网络接口、路由、内存限制等等。 (例如,RabbitMQ 将数据存储在内存中,但是突然重启或 运行 内存不足时会发生什么情况?) 人们通常说 'guaranteed delivery' 的意思是存在某种检测和重试机制。这通常是设计您的应用程序的问题,而不是使用的产品。在分布式网络中,不可能 100% 了解整个状态。

首先,ZeroMQ 是一个库,而不是一个产品。这意味着(使用几行代码)您可以创建具有任何类型冗余的任何类型的架构。 ZeroMQ 是无代理的,这意味着没有单点故障 - 但如果你真的想要,你可以使用 ZMQ 编写一个代理系统。

MQTT 是一个 PUB/SUB 系统,它使用检查消息传递的代理。这引入了单点故障。

ZeroMQ 有比 PUB/SUB 更多的套接字类型,用于不同的用例,其中 MQTT 只知道 PUB/SUB.

Zyre 是为不稳定的网络构建的消息传递系统,可保证交付(在限制范围内)。它是使用 ZeroMQ 构建块构建的,可能最适合 IoT