“保证交付”消息传递 - 我应该使用MQTT还是ZeroMQ?

6
我们需要一个轻量级的基于客户端的消息解决方案。我们之前使用过AMQP、RabbitMQ,但在C++中存在问题。
我们想选择ZeroMQ和malamuteserver或MQTT?我们的物联网设备将几乎每5分钟发布一次数据(45 kb)。
我们需要100%地传递这个消息,不想丢失任何消息。
我们尝试了MQTT QoS级别2,但当服务器断开连接或主服务器客户端出现问题时,我们会丢失已发布的消息。
我们需要完全符合RabbitMQ任务/工作者模型。如果发生任何情况,消息应该在服务器中排队,直到消费者连接。
欢迎任何建议、方向和示例。
P.S.:这将是生产环境,所以我们希望选择不太有问题的方式 :)
3个回答

9
我认为MQTT被过度宣传了,当然,我认为这是由于可用的开源服务器所导致的。Zeromq提供了许多功能来构建满足要求的东西。我看到的选项越多,我就越倾向于使用zeromq。在我们的情况下,我们将从大量设备(网状网络中的网关或终端节点本身)随机接收数据。我们最终的消息大小非常简单,是一个定界字符串、二进制编码、压缩后不到100字节,并通过网络发送。我已经决定在服务器上使用zeromq来接收消息。原因不仅仅是基于zeromq作为代理,而且还包括如何利用其curveZmq特性使设备的配置变得容易,并允许简单的零触摸配置系统和密钥管理。目前我正在考虑使用发布/订阅模式还是推/拉模式,在每个终端设备上作为发布者或推送器,并在云服务器上设置代理订阅者。在发布/订阅中,通常有较少的发布者和更多的订阅者。在典型的大规模物联网部署中,有更多的发布者和较少的订阅者,这让我想知道是否应该选择发布/订阅,而且慢速加入订阅者可能会丢失消息。如果我们关闭服务器进行维护,那么现场的设备将一直发布消息,直到HWM被达到。不管什么情况,总有丢失消息的风险,例如回程网络出现故障并且设备到达了HWM - 这是无法控制的。

Malamute没有太多文档,否则我会更深入地探索它。

所以,你决定使用什么了吗?如果您想要持久化消息直到它们被消费,请强烈建议使用zeromq作为代理,并使用工作者将消息推入持久存储中...您还可以在其中加入序列号等创意,允许客户端请求给定序列范围内的消息等等,如果它们丢失了。


感谢您花费时间给出优雅且富有信息的回复。我一定会去看看并测试ZMQ。但是让我担心的是,这个开发看起来有点老旧。 - 2adnielsenx xx
这个回答仍然正确。尽管有所热门的说法。ZeroMQ 无需经纪人,文档齐全,支持多种语言,仍然可以胜任工作。 - dlewin

3

A: 我们需要完全传递这条消息,不想丢失任何信息。
B: 如果发生任何事情,消息应该在服务器中排队,直到消费者连接。
C: 这将是生产环境,所以我们希望选择一个问题较少的方式 :)

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

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

ZeroMQ是一种轻量级的方案,可以超越引用吞吐量的方式进行微调和调整,但要充分理解Zen-of-Zero的优势并不容易。该软件包的设计旨在提供零保证,并让所有用户设计自己的特定用例(即所需的“恰好足够”的保证,以便不会损失任何效率)。因此,需要花费适当的设计工作来覆盖成本,并实现设计目标。对于任何CTO来说,这都是一个常见的任务,需要面对和决定下一步的步骤。
奖励部分
如果需要最小化物联网设备的要求,可以比较这些C成本和一个更轻量级的可扩展正式通信模式原型框架的类似自定义适应性,该框架是由Martin Sustrik等人设计的,作为ZeroMQ的妹妹--,在大量物联网设备中广泛存在的低功率/稀缺资源上可能会有一些节省。

1
关于A、B、C概念,MQTT和ZeroMQ之间有何比较? - Rahibe Meryem

0
在现实世界中并不存在所谓的“保证交付”,因为事情可能在多个层面出错:硬件、网络、网络接口、路由、内存限制等等。例如,RabbitMQ在内存中存储数据,但在突然重启或内存耗尽时会发生什么?
当人们说“保证交付”时,通常指有一些检测和重试机制。这通常是设计应用程序而不是使用产品的问题。在分布式网络中,不可能对整个状态有100%的了解。
首先,ZeroMQ是一个库,而不是一个产品。这意味着(通过几行代码)您可以使用任何类型的冗余来构建任何类型的架构。 ZeroMQ是无中心化的,这意味着没有单点故障-但如果您真的想,可以使用ZMQ编写代理系统。
MQTT是一个PUB / SUB系统,它使用代理来检查消息的传递。这引入了单点故障的风险。
ZeroMQ拥有许多不同的套接字类型,针对不同的用例,而MQTT只知道PUB / SUB。

Zyre是一个专为不稳定网络构建的消息系统,可以在一定程度上保证消息传递。它使用ZeroMQ构建模块,并且可能最适合物联网领域。


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