Какую форму соединения использовать с пикой

Я пытался выяснить, какую форму соединения я должен использовать при использовании pika, насколько я понимаю, у меня есть две альтернативы.

Либо BlockingConnection, либо SelectConnection, однако я не совсем уверен в различиях между этими двумя (т.е. что блокирует BlockingConnection? и многое другое)

В документации для pika говорится, что SelectConnection является предпочтительным способом подключения к Rabbit, поскольку он предоставляет «множество методов уведомления о событиях, включая select, epoll, kqueue и poll».

Итак, мне интересно, каковы последствия этих двух разных видов соединений?

PS: я знаю, что не должен ставить тег в заголовке, но в этом случае я думаю, что это поможет прояснить вопрос.


person Daniel Figueroa    schedule 16.08.2012    source источник


Ответы (2)


SelectConnection полезен, если архитектура вашего приложения может выиграть от асинхронного дизайна, например. делать что-то еще, пока завершается ввод-вывод RabbitMQ (например, переключаться на какой-либо другой ввод-вывод и т. д.). Этот тип соединения использует обратные вызовы, чтобы указать, когда функции возвращаются. Например, вы можете объявить обратные вызовы для

on_connected, on_channel_open, on_exchange_declared, on_queue_declared и т. д.

...для выполнения операций при срабатывании этих событий.

Преимущество особенно хорошо, если ваш сервер RabbitMQ (или соединение с этим сервером) работает медленно или перегружен.

BlockingConnection с этой стороны именно таков — он блокируется до тех пор, пока вызванная функция не вернется. поэтому он будет блокировать поток выполнения до тех пор, пока не будет подключен или, например, канал_открытый или обменный_декларированный или очередь_декларированный возврат. Тем не менее, часто проще запрограммировать такую ​​сериализованную логику, чем асинхронную логику SelectConnection. Для простых приложений с отзывчивыми серверами RabbitMQ они также работают нормально, IMO.

Я полагаю, вы уже читали документацию Pika http://pika.readthedocs.io/en/stable/intro.html, если нет, то это абсолютно необходимая информация перед использованием Pika!

Ваше здоровье!

person Sachin    schedule 16.08.2012

В документации Pika достаточно четко описаны различия между типами подключения. Основное отличие состоит в том, что адаптер pika.adapters.blocking_connection.BlockingConnection() используется для неасинхронного программирования, а адаптер pika.adapters.select_connection.SelectConnection() используется для асинхронного программирования.

Если вы не знаете, в чем разница между неасинхронным/синхронным и асинхронным программированием, я предлагаю вам прочитать это вопрос или для более глубокого технического объяснения это статья.

Теперь давайте погрузимся в различные адаптеры Pika и посмотрим, что они делают. Для примера я предполагаю, что мы используем Pika для настройки клиентского соединения с RabbitMQ в качестве брокера сообщений AMQP.

Блокировка соединения ()

В следующем примере выполняется подключение к RabbitMQ, прослушивающему порт 5672 на localhost с использованием имени пользователя guest и пароля guest и виртуальный хост '/'. После подключения открывается канал, и сообщение публикуется на бирже test_exchange с использованием ключа маршрутизации test_routing_key. Передаваемое значение BasicProperties устанавливает для сообщения режим доставки 1 (не сохраняемый) с типом содержимого text/plain. После публикации сообщения соединение закрывается:

import pika

parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F')

connection = pika.BlockingConnection(parameters)

channel = connection.channel()

channel.basic_publish('test_exchange',
                      'test_routing_key',
                      'message body value',
                      pika.BasicProperties(content_type='text/plain',
                                           delivery_mode=1))

connection.close()

ВыбратьСоединение()

Напротив, использование этого адаптера подключения является более сложным и менее питоническим, но при использовании с другими асинхронными службами он может значительно повысить производительность. В следующем примере кода используются все те же параметры и значения, что и в предыдущем примере:

import pika

# Step #3
def on_open(connection):

    connection.channel(on_open_callback=on_channel_open)

# Step #4
def on_channel_open(channel):

    channel.basic_publish('test_exchange',
                            'test_routing_key',
                            'message body value',
                            pika.BasicProperties(content_type='text/plain',
                                                 delivery_mode=1))

    connection.close()

# Step #1: Connect to RabbitMQ
parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F')

connection = pika.SelectConnection(parameters=parameters,
                                   on_open_callback=on_open)

try:

    # Step #2 - Block on the IOLoop
    connection.ioloop.start()

# Catch a Keyboard Interrupt to make sure that the connection is closed cleanly
except KeyboardInterrupt:

    # Gracefully close the connection
    connection.close()

    # Start the IOLoop again so Pika can communicate, it will stop on its own when the connection is closed
    connection.ioloop.start()

Вывод

Для тех, кто занимается простым неасинхронным/синхронным программированием, адаптер BlockingConnection() оказывается самым простым способом приступить к работе с Pika для публикации сообщений. Но если вы ищете способ реализовать асинхронную обработку сообщений, обработчик SelectConnection() — ваш лучший выбор.

Удачного кодирования!

person marcuse    schedule 03.05.2020