Совместное использование одного и того же экземпляра клиента MQTT между MqttPahoMessageHandler и MqttPahoMessageDrivenChannelAdapter в интеграции Spring Boot

Предположим, у меня есть одно приложение Spring Boot, которому необходимо создать экземпляры нескольких клиентов MQTT (# ~10^4) для виртуализации физических устройств в брокере (Mosquitto). У каждого из них есть уникальный идентификатор клиента, чтобы получать / отправлять сообщения из / в определенные темы.

Я пытаюсь добиться этого с помощью входящих / исходящих потоков интеграции MQTT в Spring Boot (spring-integration-mqtt-5.1.6.RELEASE), но каждый поток (MqttPahoMessageDrivenChannelAdapter/MqttPahoMessageHandler) создает собственный клиент для управления входящими / исходящими сообщениями.

Меня беспокоит:

  • По определению, я не могу использовать только один клиент для потока ввода / вывода из-за структуры потоков интеграции Spring Boot MQTT.
  • Это может быть неэффективно, потому что мне нужны два разных клиента, а это удваивает ресурсы.
  • Я не могу использовать один и тот же идентификатор клиента для каждого "логического" канала, потому что я использую два разных клиента MQTT, и, как вы знаете, если вы попытаетесь подключиться к одному и тому же брокеру с тем же идентификатором клиента, отключается самый старый. Таким образом, мне нужны разные конфигурации (и авторизация на стороне сервера) для каждого логического входящего / исходящего потока, чтобы отправлять и получать сообщения.
  • Приложение Spring Boot генерирует 2 раза соединения с сервером, поэтому размер сервера должен быть таким, чтобы принимать 2 раза больше входящих соединений, и это может быть проблемой.

Моя общая идея - переопределить MqttPahoMessageDrivenChannelAdapter а также MqttPahoMessageHandlerчтобы позволить им использовать один и тот же экземпляр MqttClient для одного и того же идентификатора клиента. Для этого мне нужно заново реализовать методы подключения / отключения / подписки в адаптере и обработчике, чтобы сделать их надежными. Кроме того, я должен использовать выделенную фабрику клиентов, чтобы вернуть того же клиента с тем же идентификатором клиента (это самая простая часть).

Теперь вопрос: правильный ли такой подход? Я насилую Spring Boot, пытаясь это сделать?

Единственная альтернатива, которую я нашел, - это напрямую реализовать необработанные MqttClients, управляя всем их жизненным циклом. Это работает, но я изобретаю колесо и не использую шаблон проектирования сообщений Spring Boot.

0 ответов

Другие вопросы по тегам