2

假设我有一个 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 次传入连接,这可能是一个问题。

我的总体想法是重新实现MqttPahoMessageDrivenChannelAdapterMqttPahoMessageHandler让它们为相同的客户端 ID 共享相同的 MqttClient 实例。为此,我必须在 Adapter 和 Handler 中重新实现连接/断开/订阅方法,以使它们变得健壮。此外,我必须使用专用的客户端工厂才能为相同的客户端 ID 返回相同的客户端(这是最简单的部分)。

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

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

4

0 回答 0