MQTT可以用于排队吗?

物联网 MQTT https 流媒体
2021-06-09 02:11:31

我正在构建一个具有以下要求的项目:

  1. 我的硬件设备 (NanoPi) 应该访问代理以获取视频密钥。
  2. 代理应该有一个队列,该队列将保存服务器发送的视频密钥,并根据请求将其转发到设备。
  3. 设备将视频密钥推送到远程服务器并请求特定视频。
  4. 远程服务器将视频发送到设备,设备将其显示在监视器上。
  5. 视频完成后,设备将再次请求新的视频密钥。

我应该使用哪个代理来将视频密钥存储在队列中?MQTT 代理是否适合我的应用程序?如果不是,我应该使用哪个其他经纪人?

2个回答

我不确定 MQTT 是否真的能很好地满足您的需求。MQTT 具有“保留消息”的概念,由服务器保留并在客户端连接后立即发送给客户端。但是,你只能有一个保留每个主题的消息; 不是消息队列。

如果客户端连接到代理,您可以按顺序发送数据包,并且顺序通常会保留(在 QoS 1 和 2 中),但您的客户端需要处理排队。一旦代理收到数据包,代理就会将数据包发送给客户端。

我认为您会发现拥有一个通过 API(可能是 REST API)访问的中央服务器来处理分发密钥会更容易。

例如,您的客户端可以发送一个请求:

POST /key/new

然后服务器可以为客户端创建一个新密钥并发送它。这对我来说似乎比添加 MQTT 代理的间接性更容易,后者无法为您提出的解决方案增加任何好处。

我同意 Aurora 的回答——可能有更好的解决方案来实现队列而不是 MQTT,但在 MQTT 中它仍然是绝对可能的。

您需要 MQTT 代理和 clean=false(在 MQTT 3.x 中)或具有适当的到期期限 (MQTT 5.0)。然后,逻辑非常简单。

您有持久(但未连接)的客户端会话,该会话使用 QoS=1 订阅以更正主题以接收和缓冲密钥,由您的密钥生成器发布。

设备使用适当的 client_id 连接、授权给定会话并立即接收密钥。您应该只确认第一个键,然后关闭连接。

也就是说——您在客户端有一个密钥,当 MQTT 代理收到数据包的确认时,它会将其从会话存储中删除。