SlideShare uma empresa Scribd logo
1 de 14
RabbitMQ
Первые шаги
Александр Светкин
alex.svetkin@gmail.com
2017-02-01
Что такое RabbitMQ
● RabbitMQ — это брокер сообщений, он берет на себя работу по приему,
маршрутизации и выдаче сообщений (а также HA, WebUI etc.)
● Сообщение состоит из тела и заголовков (plain text)
● Маршрутизация строится на связи exchanges и очередей
● Не единственный в своем роде: см. Kafka, ActiveMQ
● RabbitMQ реализует открытый протокол AMQP c расширениями
2
● Дистрибутивы: https://www.rabbitmq.com/download.html
○ Ubuntu/Debian: есть .deb из официального PPA
○ Docker: https://hub.docker.com/_/rabbitmq/
○ Puppet: https://github.com/puppetlabs/puppetlabs-rabbitmq
● Web: http://localhost:15672, логин:пароль — admin:admin
● CLI:
# rabbitmq-plugins enable rabbitmq_management
# wget "http://localhost:15672/cli/rabbitmqadmin"
Как начать работать с RabbitMQ
3
Применение и особенности MQ
● Асинхронное/отложенное выполнение задач
● Распределение задач между потребителями
● Очереди с приоритетами (https://www.rabbitmq.com/priority.html)
● Pub/Sub
● RPC (Remote Procedure Calls)
● Шина сообщений для микросервисов
4
Exchanges & queues & routing keys
● Вы задаете exchange и routing_key сообщению при отправке
○ default exchange: все очереди связаны с ним по routing_key == queue_name
○ default exchange называется amq.direct или ""
○ 4 типа exchanges: direct, fanout (broadcast), topic (key pattern match), headers
(message headers match)
● Сообщения читаются из очередей (queue)
● Очередь накапливает сообщения, exchange — нет
5
Немного про маршрутизацию
● Упрощенная схема
● Не указан exchange
● Подразумевается default
exchange
● queue_name == routing_key
● Явно указан exchange
● Сообщения отправляются в X
● X связан с очередью
P X
C1
C2
6
Bindings
Binding (связь) — это описание, как сообщение попадает из exchange в queue
● Для default и fanout exchanges соответствие предустановлено
● Для остальных типов (direct, topic) соответствие задается через API,
management plugin или в WebUI
● Если exchange связан с несколькими очередями, каждая получает копию
сообщения
● Exchange без связей с очередями — это “/dev/null”
● Связи можно строить “на лету”, маршрутизацию можно зацикливать,
устанавливать TTL etc. 7
Channels
● Channel (канал) — это виртуальное легковесное соединение вашего
приложения с сервером RabbitMQ внутри одного TCP соединения
(connection)
● Каналы независимы друг от друга и не делят состояние друг друга
○ Delivery tags сообщений имеют нумерацию внутри канала (а не глобальную)
● Обычно вам нужен только один канал на приложение
○ Но на каждый thread создавайте отдельный channel (или используйте
блокировки)
● Закрытие канала приводит к отменам “висящих” подтверждений и 8
Delivery acks & nacks
● Сбой при обработке сообщения приведет к его потере. Для избежания
этого используется механизм подтверждений (acknowledgments)
получения
● Сообщения без подтверждения снова окажутся в очереди и могут быть
получены после восстановления от сбоя (или другими потребителями)
● Команда ack — сообщение обработано, удалить
● Команда nack — сообщение не обработано, удалить (см. DLX)
● ack/nack выполняется над delivery tag сообщения (узнаем при
получении) 9
Некоторые паттерны
Autodelete: no и Durable: yes для очередей
JSON-encoded тело сообщений
Прорабатываем ситуации:
● “ack on delivery” или подтверждаем вручную?
● ошибка при обработке сообщения: не падаем
● не можем обработать сообщение: reject, requeue или в другую очередь?
● потеряли сообщения (при обработке): как перезапустить все с начала
● такое сообщение уже получали: избегаем дублирования
10
Пример: обработка файлов
Было: приложение А пишет имена файлов в
таблицу БД, приложение Б периодически
считывает строки из таблицы и обрабатывает
файлы, после отмечает строки как
обработанные.
Плюсы: все имена файлов сохраняются
Минусы:
— требуется механизм блокировки записей
— блокировки усложняются при необходимости
добавить еще одного потребителя
— среднее время ожидания файла — 1/2
периода
Стало: приложение А отправляет сообщение,
приложение Б получает сообщение, производит
обработку, подтверждает получение.
Плюсы:
— не требуются блокировки
— легко добавить новых потребителей
— минимальное время ожидания файла
Минусы:
— обработанные сообщения не сохраняются
11
Dead Letter Exchange (DLX)
● Обычно мы хотим сохранить сообщения, которые мы не смогли
обработать для исследований. Например, отправив их в отдельную
очередь с ошибочными сообщениями
● Процесс можно упростить, настроив DLX для очереди. Nack сообщения
вместо удаления отправит его в указанный DLX (а далее по роутингу)
P X
C2
my_dlx
err_queue
my_queue
DLX=my_dlx
consume
12
Дальнейшее чтение
● Уроки и примеры RabbitMQ: https://www.rabbitmq.com/getstarted.html
● “Очереди и блокировки. Теория и практика” (HighLoad Junior):
https://habrahabr.ru/company/oleg-bunin/blog/316458/
● Надежность доставки и отказоустойчивость в RabbitMQ:
https://www.rabbitmq.com/reliability.html
13
Спасибо за внимание!
14

Mais conteúdo relacionado

Mais procurados

"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
AvitoTech
 
мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1
rit2011
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
Ontico
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Ontico
 

Mais procurados (20)

openSUSE Build Server от Б до Ю
openSUSE Build Server от Б до ЮopenSUSE Build Server от Б до Ю
openSUSE Build Server от Б до Ю
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
 
«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень«​Масштабируемый DevOps​» Александр Колесень
«​Масштабируемый DevOps​» Александр Колесень
 
04 web server_deployment_ru
04 web server_deployment_ru04 web server_deployment_ru
04 web server_deployment_ru
 
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual MachinesTMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
TMPA-2015: Multi-Platform Approach to Reverse Debugging of Virtual Machines
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
 
мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1
 
pgconf.ru 2015.avito postgresql recovery
pgconf.ru 2015.avito postgresql recoverypgconf.ru 2015.avito postgresql recovery
pgconf.ru 2015.avito postgresql recovery
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
07 virtual hosts_ru
07 virtual hosts_ru07 virtual hosts_ru
07 virtual hosts_ru
 
Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
pgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresqlpgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresql
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера
 

Semelhante a Первые шаги с RabbitMQ

Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Ontico
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
DevDay
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
Yandex
 
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Ontico
 
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Ontico
 
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
HLL
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Ontico
 
Smirnov Twisted Python
Smirnov Twisted PythonSmirnov Twisted Python
Smirnov Twisted Python
HighLoad2009
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
Andrey Smirnov
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Ontico
 

Semelhante a Первые шаги с RabbitMQ (20)

Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
Использование асинхронной очереди сообщений в высоконагруженном проекте / Анд...
 
Асинхронная обработка данных: RabbitMQ, Comet
Асинхронная обработка данных: RabbitMQ, CometАсинхронная обработка данных: RabbitMQ, Comet
Асинхронная обработка данных: RabbitMQ, Comet
 
Tuning Azure Service Bus (RU)
Tuning Azure Service Bus (RU)Tuning Azure Service Bus (RU)
Tuning Azure Service Bus (RU)
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
 
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
 
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
Как не надо писать приложения, основанные на протоколе TCP (Артём Гавриченков)
 
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
Порядок преодоления болота на маршруте: как не надо писать приложения, основа...
 
Dev collaboration
Dev collaborationDev collaboration
Dev collaboration
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
 
Smirnov Twisted Python
Smirnov Twisted PythonSmirnov Twisted Python
Smirnov Twisted Python
 
Web лекция 1
Web   лекция 1Web   лекция 1
Web лекция 1
 
В поисках эффективного middleware
В поисках эффективного middlewareВ поисках эффективного middleware
В поисках эффективного middleware
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
 
Sivko
SivkoSivko
Sivko
 
МАИ, Сети ЭВМ, Лекция №3
МАИ, Сети ЭВМ, Лекция №3МАИ, Сети ЭВМ, Лекция №3
МАИ, Сети ЭВМ, Лекция №3
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
 

Первые шаги с RabbitMQ

  • 2. Что такое RabbitMQ ● RabbitMQ — это брокер сообщений, он берет на себя работу по приему, маршрутизации и выдаче сообщений (а также HA, WebUI etc.) ● Сообщение состоит из тела и заголовков (plain text) ● Маршрутизация строится на связи exchanges и очередей ● Не единственный в своем роде: см. Kafka, ActiveMQ ● RabbitMQ реализует открытый протокол AMQP c расширениями 2
  • 3. ● Дистрибутивы: https://www.rabbitmq.com/download.html ○ Ubuntu/Debian: есть .deb из официального PPA ○ Docker: https://hub.docker.com/_/rabbitmq/ ○ Puppet: https://github.com/puppetlabs/puppetlabs-rabbitmq ● Web: http://localhost:15672, логин:пароль — admin:admin ● CLI: # rabbitmq-plugins enable rabbitmq_management # wget "http://localhost:15672/cli/rabbitmqadmin" Как начать работать с RabbitMQ 3
  • 4. Применение и особенности MQ ● Асинхронное/отложенное выполнение задач ● Распределение задач между потребителями ● Очереди с приоритетами (https://www.rabbitmq.com/priority.html) ● Pub/Sub ● RPC (Remote Procedure Calls) ● Шина сообщений для микросервисов 4
  • 5. Exchanges & queues & routing keys ● Вы задаете exchange и routing_key сообщению при отправке ○ default exchange: все очереди связаны с ним по routing_key == queue_name ○ default exchange называется amq.direct или "" ○ 4 типа exchanges: direct, fanout (broadcast), topic (key pattern match), headers (message headers match) ● Сообщения читаются из очередей (queue) ● Очередь накапливает сообщения, exchange — нет 5
  • 6. Немного про маршрутизацию ● Упрощенная схема ● Не указан exchange ● Подразумевается default exchange ● queue_name == routing_key ● Явно указан exchange ● Сообщения отправляются в X ● X связан с очередью P X C1 C2 6
  • 7. Bindings Binding (связь) — это описание, как сообщение попадает из exchange в queue ● Для default и fanout exchanges соответствие предустановлено ● Для остальных типов (direct, topic) соответствие задается через API, management plugin или в WebUI ● Если exchange связан с несколькими очередями, каждая получает копию сообщения ● Exchange без связей с очередями — это “/dev/null” ● Связи можно строить “на лету”, маршрутизацию можно зацикливать, устанавливать TTL etc. 7
  • 8. Channels ● Channel (канал) — это виртуальное легковесное соединение вашего приложения с сервером RabbitMQ внутри одного TCP соединения (connection) ● Каналы независимы друг от друга и не делят состояние друг друга ○ Delivery tags сообщений имеют нумерацию внутри канала (а не глобальную) ● Обычно вам нужен только один канал на приложение ○ Но на каждый thread создавайте отдельный channel (или используйте блокировки) ● Закрытие канала приводит к отменам “висящих” подтверждений и 8
  • 9. Delivery acks & nacks ● Сбой при обработке сообщения приведет к его потере. Для избежания этого используется механизм подтверждений (acknowledgments) получения ● Сообщения без подтверждения снова окажутся в очереди и могут быть получены после восстановления от сбоя (или другими потребителями) ● Команда ack — сообщение обработано, удалить ● Команда nack — сообщение не обработано, удалить (см. DLX) ● ack/nack выполняется над delivery tag сообщения (узнаем при получении) 9
  • 10. Некоторые паттерны Autodelete: no и Durable: yes для очередей JSON-encoded тело сообщений Прорабатываем ситуации: ● “ack on delivery” или подтверждаем вручную? ● ошибка при обработке сообщения: не падаем ● не можем обработать сообщение: reject, requeue или в другую очередь? ● потеряли сообщения (при обработке): как перезапустить все с начала ● такое сообщение уже получали: избегаем дублирования 10
  • 11. Пример: обработка файлов Было: приложение А пишет имена файлов в таблицу БД, приложение Б периодически считывает строки из таблицы и обрабатывает файлы, после отмечает строки как обработанные. Плюсы: все имена файлов сохраняются Минусы: — требуется механизм блокировки записей — блокировки усложняются при необходимости добавить еще одного потребителя — среднее время ожидания файла — 1/2 периода Стало: приложение А отправляет сообщение, приложение Б получает сообщение, производит обработку, подтверждает получение. Плюсы: — не требуются блокировки — легко добавить новых потребителей — минимальное время ожидания файла Минусы: — обработанные сообщения не сохраняются 11
  • 12. Dead Letter Exchange (DLX) ● Обычно мы хотим сохранить сообщения, которые мы не смогли обработать для исследований. Например, отправив их в отдельную очередь с ошибочными сообщениями ● Процесс можно упростить, настроив DLX для очереди. Nack сообщения вместо удаления отправит его в указанный DLX (а далее по роутингу) P X C2 my_dlx err_queue my_queue DLX=my_dlx consume 12
  • 13. Дальнейшее чтение ● Уроки и примеры RabbitMQ: https://www.rabbitmq.com/getstarted.html ● “Очереди и блокировки. Теория и практика” (HighLoad Junior): https://habrahabr.ru/company/oleg-bunin/blog/316458/ ● Надежность доставки и отказоустойчивость в RabbitMQ: https://www.rabbitmq.com/reliability.html 13