[Часть 2.2] RabbitMQ примеры кода Python

Будем следовать сценарию, использованному в предыдущей статье  «Что такое RabbitMQ?». Веб-сайт будет обрабатывать информацию и генерировать PDF-файл и отправлять его обратно пользователю. Создание PDF-файла и отправка электронной почты в этом сценарии займет несколько секунд. Если вы не знакомы с RabbitMQ и очередью сообщений, я бы рекомендовал вам прочитать RabbitMQ для новичков — что такое RabbitMQ? перед началом работы с этим руководством.

Начало работы с RabbitMQ и Python

Начните с загрузки клиентской библиотеки для Python. Рекомендуемой библиотекой для Python является Pika. Поместите pika == version в файл require.txt.

Для начала вам понадобится установить RabbitMQ.

При запуске кода будет установлено соединение между RabbiMQ и вашим приложением. Будут объявлены и созданы очереди, если они еще не существуют, и, наконец, сообщение будет опубликовано. Метод публикации будет помещать сообщения в очередь, и если соединение отключено, повторно отправит сообщение позже. Пользователь подписывается на очередь. Сообщения обрабатываются один за другим и отправляются методу обработки PDF.

Новое сообщение будет публиковаться каждую секунду. Будет использоваться обмен по умолчанию, идентифицирующий пустую строку («»). Обмен по умолчанию означает, что сообщения направляются в очередь с именем, указанным routing_key, если оно существует. (Обмен по умолчанию — это прямой обмен без имени)

Загрузите клиентскую библиотеку и настройте параметры конфигурации. Значение DEFAULT_SOCKET_TIMEOUT равно 0,25 с, мы рекомендуем повысить этот параметр примерно до 5 с, чтобы избежать таймаута соединения, params.socket_timeout = 5 Другие параметры подключения для Pika можно найти здесь: http://pika.readthedocs.io/en/latest/modules/parameters.html

Устанавливаем соединение 

pika.BlockingConnection устанавливает соединение с RabbitMQ сервером.

Подключаем канал

connection.channel создает канал в TCP соединении.

Назначаем очередь

channel.queue_declare  создает очередь, на которую будет доставлено сообщение. В очереди будет указано имя pdfprocess.

Публикация сообщения

channel.basic_publish опубликует сообщение в канал с ключом маршрутизации и телом. Будет использоваться обмен по умолчанию, идентифицирующий пустую строку («»). Обмен по умолчанию означает, что сообщения направляются в очередь с именем, указанным routing_key, если оно существует. (Обмен по умолчанию — это прямой обмен без имени).

Закрываем соединение  

Consumer

pdf_process_function такая же todo-функция как и в примере по Node.js. Функция будет спать в течение 5 секунд, чтобы имитировать создание PDF.

Функция которая будет вызываться для входящих сообщений 

Функция обратного вызова будет вызываться для каждого сообщения, полученного из очереди. Функция вызовет функцию, которая имитирует обработку PDF.

basic_consume связывает сообщения с функцией обратного вызова консьюмера.

start_consuming начинает читать сообщения из очереди

Leave a Reply

2 комментария

  1. Максим Ответить

    Здравствуйте!
    У вас просто отличный сайт и контент! Спасибо за все, что вы тут размещаете!

    У меня вопрос про RabbitMQ: возможно ли передавать через его очередь не сообщения, а файлы?
    Как это реализовать?
    (если у вас нет времени/желания писать статью, дайте хотя бы подсказку по e-mail).

    А то уже устанавливаю второй брокер на сервер, но результат все еще нет… 🙁
    Сначала был MQTT, теперь кролик. Не хочется связываться с IBM MQ, да и дорого это — не реально выпросить финансирование под это дело.

    Если с кроликом будет облом, придется пробовать Apache ActiveMQ…

    • windsurfer АвторОтветить

      Добрый день, не сталкивался с кейсом передачи самих файлов, передавали путь на s3, а потом уже приложение обрабатывало …

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.