Здесь полезно хорошее концептуальное понимание того, что делает протокол AMQP «под капотом». Я хотел бы предложить, что документация и API, которые AMQP 0.9.1 выбрал для развертывания, делают это особенно запутанным, поэтому сам вопрос - это вопрос, с которым приходится сталкиваться многим.
TL; DR
Соединение является физическим переговорами TCP сокета с сервером AMQP. Правильно реализованные клиенты будут иметь один из них для каждого приложения, потокобезопасный, разделяемый между потоками.
Канал представляет собой один сеанс приложения на связи. Поток будет иметь один или несколько из этих сеансов. Архитектура AMQP 0.9.1 заключается в том, что они не предназначены для совместного использования между потоками и должны быть закрыты / уничтожены, когда созданный им поток завершит работу с ним. Они также закрываются сервером при различных нарушениях протокола.
Потребитель представляет собой виртуальную конструкцию , которая представляет наличие «почтовый ящик» на определенном канале. Использование потребителя указывает посреднику отправлять сообщения из определенной очереди в конечную точку этого канала.
Факты подключения
Во-первых, как правильно отметили другие, соединение - это объект, представляющий фактическое TCP-соединение с сервером. Соединения указываются на уровне протокола в AMQP, и вся связь с брокером происходит через одно или несколько соединений.
- Поскольку это фактическое TCP-соединение, у него есть IP-адрес и номер порта.
- Параметры протокола согласовываются для каждого клиента как часть настройки соединения (процесс, известный как квитирование .
- Это разработано, чтобы быть долговечным ; Есть несколько случаев, когда закрытие соединения является частью дизайна протокола.
- С точки зрения OSI, он, вероятно, находится где-то около уровня 6
- Пульс может быть настроен для мониторинга состояния соединения, так как TCP не содержит ничего для этого сам по себе.
- Лучше всего, чтобы выделенный поток управлял чтением и записью в базовый сокет TCP. Большинство, если не все, клиенты RabbitMQ делают это. В связи с этим они, как правило, потокобезопасны.
- Условно говоря, соединения «дороги» в создании (из-за рукопожатия), но практически это не имеет значения. Большинству процессов действительно нужен только один объект подключения. Но вы можете поддерживать соединения в пуле, если обнаружите, что вам нужна более высокая пропускная способность, чем может обеспечить один поток / сокет (маловероятно для современных вычислительных технологий).
Факты о канале
Канал является приложением сеанса , который открыт для каждой части вашего приложения , чтобы общаться с RabbitMQ брокером. Он работает через одно соединение и представляет сеанс с брокером.
- Поскольку он представляет логическую часть логики приложения, каждый канал обычно существует в своем собственном потоке.
- Как правило, все каналы, открытые вашим приложением, будут использовать одно соединение (это облегченные сеансы, которые работают поверх соединения). Соединения потокобезопасны, так что все в порядке.
- Большинство операций AMQP происходит по каналам.
- С точки зрения уровня OSI, каналы, вероятно, находятся вокруг уровня 7 .
- Каналы предназначены для переходных процессов ; Часть дизайна AMQP заключается в том, что канал обычно закрывается в ответ на ошибку (например, повторное объявление очереди с другими параметрами перед удалением существующей очереди).
- Поскольку они временные, каналы не должны объединяться вашим приложением.
- Сервер использует целое число для идентификации канала. Когда поток, управляющий соединением, получает пакет для определенного канала, он использует этот номер, чтобы сообщить посреднику, к какому каналу / сеансу принадлежит пакет.
- Каналы, как правило, не являются потокобезопасными, поскольку не имеет смысла делить их между потоками. Если у вас есть другой поток, который должен использовать брокера, необходим новый канал.
Потребительские факты
Потребитель - это объект, определенный протоколом AMQP. Это не канал и не соединение, а то, что ваше конкретное приложение использует в качестве своего рода «почтового ящика» для отбрасывания сообщений.
- «Создание потребителя» означает, что вы сообщаете брокеру (используя канал через соединение ), что хотите, чтобы сообщения передавались вам по этому каналу. В ответ брокер зарегистрирует, что у вас есть потребитель на канале, и начнет рассылать вам сообщения.
- Каждое сообщение, передаваемое через соединение, будет ссылаться как на номер канала, так и на номер потребителя . Таким образом, поток управления соединениями (в данном случае в Java API) знает, что делать с сообщением; затем поток обработки канала также знает, что делать с сообщением.
- Потребительская реализация имеет самые широкие вариации, потому что она буквально зависит от приложения. В моей реализации я выбрал выделение задачи каждый раз, когда сообщение поступало от потребителя; таким образом, у меня был поток, управляющий соединением, поток, управляющий каналом (и, соответственно, потребителем), и один или несколько потоков задач для каждого сообщения, доставляемого через потребителя.
- Закрытие соединения закрывает все каналы соединения. Закрытие канала закрывает всех потребителей на канале. Также можно отменить потребителя (без закрытия канала). Существуют различные случаи, когда имеет смысл сделать любую из трех вещей.
- Как правило, реализация потребителя в клиенте AMQP выделяет потребителю один выделенный канал, чтобы избежать конфликтов с действиями других потоков или кода (включая публикацию).
С точки зрения того, что вы подразумеваете под пулом потребительских потоков, я подозреваю, что Java-клиент делает нечто похожее на то, что я запрограммировал для моего клиента (мой был основан на .Net-клиенте, но сильно изменен).