Объявление очереди на всех узлах в RabbitMQ
У меня есть установка кластера Rabbitmq (без HA). Мои потребители - это пружинные приложения, и он обеспечивает механизм восстановления после сбоя из коробки, где он подключается к следующему доступному узлу.
Поскольку очереди не зеркально отражены, все в порядке, если я объявлю очереди заранее и когда первый узел выйдет из строя, соединение будет установлено со вторым узлом. Имеет ли это смысл?
Другой вопрос, скажем, у меня есть баланс нагрузки на вершине кластера Rabbitmq. Мои приложения подключаются с использованием баланса нагрузки. Будут ли очереди объявлены на всех узлах или они будут объявлены на узле на основе стратегии маршрутизации LB.
1 ответ
Для первого сценария да, очереди будут объявлены в экземпляре посредника отработки отказа при установлении соединения.
Если вы хотите предварительно объявить на всех узлах, вам понадобится фабрика соединений для каждого узла, и RabbitAdmin
для каждой фабрики соединений.
Вам также понадобится что-то, чтобы вызвать соединение на каждом RabbitAdmin
зарегистрироваться как слушатели соединения).
Вы можете сделать это, добавив bean-объект SmartLifecycle
и позвонить createConnection()
на каждой фабрике соединений.
Вы также можете выборочно объявить элементы. См. Условное заявление.
По умолчанию все очереди, обмены и привязки объявляются всеми
RabbitAdmin
случаи (которые имеютauto-startup="true"
) в контексте приложения.Начиная с версии 1.2, можно условно объявить эти элементы. Это особенно полезно, когда приложение подключается к нескольким брокерам и должно указывать, с какими брокерами должен быть объявлен конкретный элемент.