Описание проблемы
Я хочу развернуть распределенное, заказанное решение для очередей для моего проекта, но у меня есть вопросы / проблемы:
Какой инструмент / решение я должен использовать? Что было бы проще реализовать / обучение и инфраструктура обойдется мне дешевле? Rabbitmq, Kafka, Redis Streams?
Как реализовать автоматическую перебалансировку тем / потоков для каждого потребителя в ситуации сбоя или при добавлении новой темы / потока в систему?
Другими словами, я хочу реализовать нечто подобное:
распределенные очереди
.. но если в одном из моих приложений произошел сбой, другие экземпляры должны взять весь трафик, который в настоящее время остается с правильным распределением (равная нагрузка).
Обратите внимание, что мой код был написан в node.js v10 (машинопись), а моя инфраструктура основана на Azure , поэтому помимо решения для самостоятельного размещения (например, RabbitMQ), Azure решение на основе (например, Azure Service Bus) также возможно, но с меньшей блокировкой от поставщика - лучшее решение для меня;)
Моя текущая архитектура
Теперь я предоставлю более подробную информацию о моей системе:
У меня есть 100 000 устройств слежения за автотранспортными средствами (разные, многие производители и протоколы), каждое из которых взаимодействует с одним из моих пользовательских приложений под названием декодер . Этот небольшой микросервис декодирует и объединяет полезную нагрузку с трекера и отправляет ее в распределенную очередь. Каждый трекер отправляет сообщение каждые 10-30 секунд.
Обратите внимание, что я должен поддерживать порядок сообщений с одного устройства , это очень важно!
На следующем шаге у меня есть приложение для обработки microservice, которое я хочу масштабировать (разветвление / кластеризация) в зависимости от количества устройств слежения. Каждая ветка этого приложения должна подписаться на некоторые темы / группы потребителей для обработки сообщений от устройств, сохраняя при этом порядок. Обработка каждого сообщения занимает около 1-3 секунд.
Обратите внимание, что в каждый момент времени я могу добавлять или удалять устройства отслеживания , и эта информация должна быть автоматически распространяться на вилки приложения обработки, и эти экземпляры должны быть возможность автоматической балансировки трафика из очереди.
Вопрос в том, как сделать это с как можно меньшим количеством строк кода (node.js) и в то же время сделать решение простым, чистым и дешевым? :)
Как вы видите на рисунке выше, если форк № 3 вышел из строя, система должна решить, какая из рабочих вилок должна получить «синие» сообщения. Кроме того, если вилка № 3 вернется обратно, также потребуется перебалансировка.
Мое собственное исследование
Я читал об Apache Kafka с группами потребителей, но Kafka сложно изучить и реализовать для меня.
Я читал о RabbitMQ и Consumer Groups / многих темах, но я не знаю, как написать функцию автоматического ребалансирования, а также как я могу использовать rabbitMQ (какие плагины? Какие настройки / конфигурации? Есть так много вариантов ...) .
Я читал о Azure Service Bus с сеансами сообщений , но у него есть блокировка от поставщиков (облако Azure), он стоит дорого, и, как и другие решения, не обеспечивает полного автоматического перебалансирования вне -Box.
Я читал о Redis Streams (с группами потребителей), но это новая функция (отсутствие библиотек для node.js), а также не обеспечивает автобалансировки.