Предположим, у меня есть одно приложение Spring Boot, которому нужно создать несколько клиентов MQTT (# ~ 10 ^ 4) для виртуализации физических устройств в брокер (Mosquitto). Каждый из них имеет уникальный идентификатор клиента, чтобы получать / отправлять сообщения от / к выделенным темам.
Я пытаюсь добиться этого, используя входящие / исходящие потоки интеграции MQTT в Spring Boot (spring -gration-mqtt-5.1.6.RELEASE), но каждый поток (MqttPahoMessageDrivenChannelAdapter/MqttPahoMessageHandler
) создает собственный клиент для управления входящими / исходящими сообщениями.
Мои опасения:
- По определениюЯ не могу использовать только один клиент для входного / выходного потока из-за структуры потоков интеграции Spring Boot MQTT.
- Это может быть неэффективно, потому что мне нужны два разных клиента, следовательно, двойные ресурсы.
- Я не могу использовать один и тот же идентификатор клиента для каждого «логического» канала, потому что я использую два разных клиента MQTT, и, как вы знаете, если вы пытаетесь подключиться к одному и тому же брокеру с тем же идентификатором клиента, самый старый из них отключается. Таким образом, мне нужны разные конфигурации (и авторизации на стороне сервера) для каждого логического потока ввода / вывода, чтобы отправлять и получать сообщения.
- Приложение Spring Boot создает два раза соединения с сервером, поэтому сервер должен бытьразмер для приема входящих соединений в 2 раза, и это может быть проблемой.
Основная идея, которую я имею, состоит в том, чтобы переопределить MqttPahoMessageDrivenChannelAdapter
и MqttPahoMessageHandler
, чтобы позволить им совместно использовать тот же экземпляр MqttClient длятот же идентификатор клиента. Чтобы сделать это, я должен переопределить методы подключения / отключения / подписки внутри Адаптера и Обработчика, чтобы сделать их устойчивыми. Кроме того, я должен использовать выделенную фабрику клиентов, чтобы вернуть одного и того же клиента для одного и того же идентификатора клиента (это самая простая часть).
Теперь возникает вопрос: правильный ли это подход? Я изнасилую Spring Boot, пытаясь это сделать?
Единственная найденная мною альтернатива - это непосредственная реализация необработанных MqttClients, управление всем их жизненным циклом. Это работает, но я заново изобретаю колесо и не использую шаблон дизайна сообщений Spring Boot.