无法接收所有已发布的消息 [AWS IOT]

Posted

技术标签:

【中文标题】无法接收所有已发布的消息 [AWS IOT]【英文标题】:Unable to receive all published messages [AWS IOT] 【发布时间】:2017-06-12 11:43:06 【问题描述】:

我正在尝试使用 5 个进程每秒发布 1000 条消息,每个进程有 200 条消息,关于一个独特的主题。并尝试使用 5 个进程进行监听,每个进程监听一个正在发布消息的主题。

问题是我无法接收所有数千条消息,并且每次执行此过程时收到的消息数量都不是恒定的。

据我了解,AWS IOT 应该允许每秒 3000 条入站消息。

【问题讨论】:

我想您没有看到足够多的消息可能有很多原因。也许您生成的不够多,也许您的网络连接限制了性能。也许经纪人端有一个限制因素。你可以控制一些事情。您尝试更改什么以查看性能是否发生变化? 我已经放置了一个打印语句,以确保我正在发送所需数量的消息,并且我正在一个 ec2 实例中运行该程序,所以我认为网络连接不是一个原因。据我从 AWS 文档中了解到,入站消息的数量可以是 3000,所以我认为我没有办法接近限制。我已将 QoS 级别设置为 1。我尝试在多个主题/单个主题上发送它,从而减少了在一个主题上发布的消息数量。 我假设您已经对每个进程进行了检测,以编程方式计算发送方进程正在发送多少消息,以及接收方进程正在接收多少消息(例如,使用 time.perf_counter)?有什么方法可以在本地同时运行发送方和接收方(在两个不同端口上使用 localhost 作为端点)? 请附上发布者/订阅者代码 感谢您对此问题发表评论。问题是我在循环中调用发布方法并且我的程序在发布后立即终止,但是发布方法正在创建一个线程来发布网络请求。因此,当我的主程序存在时,所有线程尚未发布有效负载,因此我无法获取所有消息。再次感谢您。 【参考方案1】:

尝试在 QOS-1 或 QOS-2 级别发布数据。

什么是服务质量?

服务质量 (QoS) 级别是消息的发送者和接收者之间关于保证传递消息的协议。 MQTT 中有 3 个 QoS 级别:

最多一次 (0)

至少一次 (1)

恰好一次 (2)。

在谈到 QoS 时,传递消息总是有两个不同的部分:将客户端发布到代理和代理到订阅客户端。我们需要分别查看它们,因为它们之间存在细微差别。将客户端发布到代理的 QoS 级别取决于客户端为特定消息设置的 QoS 级别。当代理将消息传输到订阅客户端时,它使用客户端先前进行的订阅的 QoS。这意味着,如果订阅的 QoS 较低,则特定接收客户端的 QoS 保证可能会降级。

为什么服务质量很重要?

QoS 是 MQTT 的一个主要特性,它使不可靠网络中的通信变得更加容易,因为该协议处理重传并保证消息的传递,无论底层传输有多不可靠。它还使客户端能够根据其网络可靠性和应用逻辑来选择 QoS 级别。

【讨论】:

以上是关于无法接收所有已发布的消息 [AWS IOT]的主要内容,如果未能解决你的问题,请参考以下文章

boto3 iot-data已发布的消息未接收

javascript [向AWS IoT发布消息] #tags:iot

aws iot 使用 php sdk 订阅?

使用 AWS 无服务器和 NodeJS 在接收器 lambda 处未接收到来自 SQS 的所有消息

从 AWS Lambda 发送 RabbitMQ 消息

python socket.io客户端无法接收广播消息