在 Spring Boot 集成中的 MqttPahoMessageHandler 和 MqttPahoMessageDrivenChannelAdapter 之间共享相同的 MQTT 客户端实例

2024-05-07

假设我有一个 Spring Boot 应用程序,需要实例化多个 MQTT 客户端 (# ~10^4),以将物理设备虚拟化为代理 (Mosquitto)。每个主题都有一个唯一的客户端 ID,以便从专用主题获取消息或向专用主题发送消息。

我正在尝试使用 Spring Boot 中的 MQTT 入站/出站集成流 (spring-integration-mqtt-5.1.6.RELEASE) 来实现此目的,但是每个流 (MqttPahoMessageDrivenChannelAdapter/MqttPahoMessageHandler)实例化自己的客户端来管理传入/传出消息。

我的担忧是:

  • 根据定义,由于 Spring Boot MQTT 集成流的结构,我不能仅使用一个客户端进行输入/输出流。
  • 它可能效率不高,因为我需要两个不同的客户端,因此资源加倍。
  • 我无法为每个“逻辑”通道使用相同的客户端 ID,因为我使用两个不同的 MQTT 客户端,并且如您所知,如果您尝试使用相同的客户端 ID 连接到同一代理,最旧的客户端会断开连接。因此,我需要为每个逻辑输入/输出流进行不同的配置(和服务器端授权)才能发送和接收消息。
  • Spring Boot 应用程序生成 2 倍到服务器的连接,因此服务器的大小必须调整为接收 2 倍传入连接,这可能是一个问题。

我的总体想法是重新实现MqttPahoMessageDrivenChannelAdapter and MqttPahoMessageHandler为了让他们为相同的客户端 ID 共享相同的 MqttClient 实例。为此,我必须在适配器和处理程序中重新实现连接/断开连接/订阅方法,以使它们更加健壮。另外,我必须使用专用的客户端工厂才能为相同的客户端 ID 返回相同的客户端(这是最简单的部分)。

现在的问题是:这种做法正确吗?我是否试图这样做而强奸 Spring Boot?

我发现的唯一替代方案是直接实现原始 MqttClients,管理它们的整个生命周期。这是可行的,但我正在重新发明轮子,而且我没有利用 Spring Boot 的消息传递设计模式。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring Boot 集成中的 MqttPahoMessageHandler 和 MqttPahoMessageDrivenChannelAdapter 之间共享相同的 MQTT 客户端实例 的相关文章

随机推荐