Прежде всего, я почти уверен, что это уже решенная проблема. Однако я не могу на всю жизнь найти правильную комбинацию поисковых терминов, чтобы найти ее где угодно.
Представьте простую коммуникацию на основе RabbitMQ на кластере Kubernetes с использованием микросервисов. Существует центральное развертывание RabbitMQ, посредством которого сообщения передаются (с использованием обмена темами), а затем используются различными микросервисами. У меня проблема в том, что каждый модуль каждого микросервиса подключается напрямую к обмену, что приводит к проблеме, заключающейся в том, что широковещательное сообщение может обрабатываться несколько раз, если микросервис масштабируется для использования нескольких модулей.
В качестве минимального примера представьте два развертывания: развертывание RabbitMQ с одним модулем и развертывание «Log» с несколькими модулями, в каждом из которых выполняется один и тот же микросервис «Log». Все, что делает микросервис Log, - это использует все сообщения из обмена RabbitMQ и сохраняет их в базе данных. Поскольку каждый экземпляр микросервиса независимо подключается к обмену (через протокол amqp), каждый из них будет независимо потреблять каждое сообщение и записывать его в базу данных. Так что, если есть пять пакетов, в базе данных будет пять записей, когда мне нужен только один.
Итак, мой вопрос: в Kubernetes, как мне лучше сбалансировать нагрузку между динамически масштабируемыми потребителями обмена темами, число которых я не знаю во время выполнения, чтобы убедиться, что сообщение от обмена только когда-либо достигает один из них?