Клиент RabbitMQ Java имеет следующие понятия:
Connection
- соединение с экземпляром сервера RabbitMQChannel
- ???- Пул потребительских потоков - пул потоков, которые принимают сообщения из очередей сервера RabbitMQ
- Очередь - структура, которая содержит сообщения в порядке FIFO
Я пытаюсь понять отношения и, что более важно , ассоциации между ними.
- Я до сих пор не совсем уверен, что это
Channel
, кроме того факта, что это структура, из которой вы публикуете и используете, и что она создается из открытого соединения. Если бы кто-то мог объяснить мне, что представляет собой «Канал», это могло бы помочь прояснить некоторые вещи. - Какая связь между каналом и очередью? Можно ли использовать один и тот же канал для связи с несколькими очередями, или он должен быть 1: 1?
- Какова связь между очередью и потребительским пулом? Могут ли несколько потребителей быть подписаны на одну и ту же очередь? Можно ли использовать несколько очередей одним и тем же потребителем? Или это соотношение 1: 1?
Заранее спасибо за любую помощь здесь!
Ответы:
A
Connection
представляет собой реальное TCP-соединение с брокером сообщений, тогда как aChannel
представляет собой виртуальное соединение (AMQP-соединение) внутри него. Таким образом, вы можете использовать столько (виртуальных) соединений, сколько вы хотите внутри своего приложения, не перегружая брокера TCP-соединениями.Вы можете использовать один
Channel
для всего. Однако, если у вас несколько потоков, рекомендуется использовать разные потокиChannel
для каждого потока.Безопасность потока канала в Руководстве по API Клиента Java :
Там нет прямой связи между
Channel
иQueue
. AChannel
используется для отправки команд AMQP посреднику. Это может быть создание очереди или подобное, но эти понятия не связаны друг с другом.Каждый
Consumer
работает в своем собственном потоке, выделенном из пула потребительских потоков. Если несколько потребителей подписаны на одну и ту же очередь, брокер использует циклический перебор для равномерного распределения сообщений между ними. См. Учебное пособие два: «Очереди работы» .Также возможно прикрепить одно и то же
Consumer
к нескольким очередям. Вы можете понимать Потребителей как обратные вызовы. Они вызываются каждый раз, когда сообщение поступает в очередь, к которой привязан потребитель. Для случая Клиента Java у каждого Потребителя есть методhandleDelivery(...)
, который представляет метод обратного вызова. Что вы обычно делаете, это подклассDefaultConsumer
и переопределениеhandleDelivery(...)
. Примечание. Если вы подключите один и тот же экземпляр Consumer к нескольким очередям, этот метод будет вызываться разными потоками. Поэтому позаботьтесь о синхронизации при необходимости.источник
Здесь полезно хорошее концептуальное понимание того, что делает протокол AMQP «под капотом». Я хотел бы предложить, что документация и API, которые AMQP 0.9.1 выбрал для развертывания, делают это особенно запутанным, поэтому сам вопрос - это вопрос, с которым приходится сталкиваться многим.
TL; DR
Соединение является физическим переговорами TCP сокета с сервером AMQP. Правильно реализованные клиенты будут иметь один из них для каждого приложения, потокобезопасный, разделяемый между потоками.
Канал представляет собой один сеанс приложения на связи. Поток будет иметь один или несколько из этих сеансов. Архитектура AMQP 0.9.1 заключается в том, что они не предназначены для совместного использования между потоками и должны быть закрыты / уничтожены, когда созданный им поток завершит работу с ним. Они также закрываются сервером при различных нарушениях протокола.
Потребитель представляет собой виртуальную конструкцию , которая представляет наличие «почтовый ящик» на определенном канале. Использование потребителя указывает посреднику отправлять сообщения из определенной очереди в конечную точку этого канала.
Факты подключения
Во-первых, как правильно отметили другие, соединение - это объект, представляющий фактическое TCP-соединение с сервером. Соединения указываются на уровне протокола в AMQP, и вся связь с брокером происходит через одно или несколько соединений.
Факты о канале
Канал является приложением сеанса , который открыт для каждой части вашего приложения , чтобы общаться с RabbitMQ брокером. Он работает через одно соединение и представляет сеанс с брокером.
Потребительские факты
Потребитель - это объект, определенный протоколом AMQP. Это не канал и не соединение, а то, что ваше конкретное приложение использует в качестве своего рода «почтового ящика» для отбрасывания сообщений.
С точки зрения того, что вы подразумеваете под пулом потребительских потоков, я подозреваю, что Java-клиент делает нечто похожее на то, что я запрограммировал для моего клиента (мой был основан на .Net-клиенте, но сильно изменен).
источник
Я нашел эту статью, которая объясняет все аспекты модели AMQP, одним из которых является канал. Я нашел это очень полезным в завершении моего понимания
https://www.rabbitmq.com/tutorials/amqp-concepts.html
источник
Существует связь между аналогами. Соединение TCP может иметь несколько каналов .
Канал : это виртуальное соединение внутри соединения. При публикации или использовании сообщений из очереди - все это делается по каналу, тогда как Connection : это TCP-соединение между вашим приложением и брокером RabbitMQ.
В многопоточной архитектуре может потребоваться отдельное соединение для каждого потока. Это может привести к недостаточному использованию TCP-соединения, а также увеличивает нагрузку на операционную систему, чтобы установить столько TCP-соединений, сколько требуется во время пиковой нагрузки сети. Производительность системы может быть резко снижена. Вот где канал пригодится, он создает виртуальные соединения внутри TCP-соединения. Это сразу снижает нагрузку на ОС, а также позволяет выполнять асинхронные операции более быстрым, надежным и одновременно.
источник