Много упорядоченных очередей - как автоматически перебалансировать потоки между экземплярами приложения? - PullRequest
0 голосов
/ 21 мая 2019

Описание проблемы

Я хочу развернуть распределенное, заказанное решение для очередей для моего проекта, но у меня есть вопросы / проблемы:

  • Какой инструмент / решение я должен использовать? Что было бы проще реализовать / обучение и инфраструктура обойдется мне дешевле? Rabbitmq, Kafka, Redis Streams?

  • Как реализовать автоматическую перебалансировку тем / потоков для каждого потребителя в ситуации сбоя или при добавлении новой темы / потока в систему?

Другими словами, я хочу реализовать нечто подобное:

распределенные очереди

.. но если в одном из моих приложений произошел сбой, другие экземпляры должны взять весь трафик, который в настоящее время остается с правильным распределением (равная нагрузка).

Обратите внимание, что мой код был написан в node.js v10 (машинопись), а моя инфраструктура основана на Azure , поэтому помимо решения для самостоятельного размещения (например, RabbitMQ), Azure решение на основе (например, Azure Service Bus) также возможно, но с меньшей блокировкой от поставщика - лучшее решение для меня;)

Моя текущая архитектура

Теперь я предоставлю более подробную информацию о моей системе:

enter image description here

У меня есть 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), а также не обеспечивает автобалансировки.

1 Ответ

0 голосов
/ 21 мая 2019

1 Брокер сообщений

По первому вопросу вы должны найти зрелого брокера протокола m2m, который даст вам свободу в разработке собственных интеллектуальных алгоритмов коммутации данных.

2 Loadbalancer

Для ответа на второй вопрос вы должны использовать хорошо выполненный балансировщик нагрузки для обработки такого огромного количества 100 000 подключенных автомобилей. Мое предложение использовать Azure API Gateway или балансировщик нагрузки Nginx.

Теперь давайте рассмотрим некоторые из подключенных автомобильных решений и проанализируем, как хорошо работают Aws IoT или Azure IoT.

OpenSource IoT Solution

Решение IoT с открытым исходным кодом

Nginx или API Gateway используется для балансировки нагрузки, в то время как обработка событий выполняется на Kafka. Используя kafka, вы можете реализовать свой собственный механизм правил для интеллектуальной коммутации данных. Точно так же любой брокер сообщений, как мост IoT, будет работать лучше. На моем месте вы бы использовали VerneMQ для реализации функций MQTTv5 и маршрутизации данных. В этом случае очередь не требуется. Опять же, если вы хотите использовать лазурную очередь, вы должны сконцентрироваться на управлении разветвлением и выгрузкой очереди. Чтобы беспрепятственно управлять очередью, вам нужно написать функцию без сервера Azure Queue Trigger. Таким образом, ваша цель не быть заблокированной продавцом будет невозможна.

Одним словом, используя VerneMQ, реализация MQTT V5 с Nginx была бы прекрасной для реализации, но, поскольку все это продукт с открытым исходным кодом, вы должны быть сильны в реализации и устранять неполадки, иначе ваша бизнес-операция будет в сбое поддержки.

Лучше использовать профессиональные облачные сервисы IoT для решения тысяч подключенных автомобилей. Это оправдывает себя, так как SLA сервиса является очень высоким стандартом и не требует больших усилий в управлении работой системы.

Azure IoT Solution

Решение Azure IoT

Если вы используете Azure Solution, вы используете IoT Hub, где вам не нужно беспокоиться о балансировке нагрузки. Используя SDK для устройств Azure, вы можете подключить всю машину с помощью мобильного LTE sim, OBD-плагина и т. Д. К облаку. Затем функция Azure может обрабатывать события и т. Д.

Решение AWS IoT

Решение AWS IoT

В отличие от SDK Azure IoT Device, в AWS IoT есть SDK для устройств. Но в этой архитектуре мы хотим завершить проект подключенного автомобиля немного по-другому. Для того, чтобы избежать тени и фактической синхронизации состояния устройства, мы использовали базовое решение AWS GreenGrass на краю. Наряду с обработкой событий IoT без использования сервера мы разработали решение для всего подключенного автомобиля.

Аналогично, край IoT Azure можно использовать для предоставления всей информации о банке двойнику устройства и синхронизации между реальной машиной и близнецами.

Надеюсь, это даст вам четкое представление о том, как реализовать и увидеть экономическую выгоду по сравнению с заблокированной или разблокированной ситуацией поставщика.

Спасибо.

...