Upgrade to Pro — share decks privately, control downloads, hide ads and more …

И снова об очередях

И снова об очередях

Доклад с YAPC::Russia 2015 в Москве.

Avatar for Ilya Chesnokov

Ilya Chesnokov

June 12, 2015

More Decks by Ilya Chesnokov

Other Decks in Programming

Transcript

  1. Генерация уменьшенных картинок • Клиент загружает изображения и уведомляет клиент

    об успехе • Сервер генерирует уменьшенные копии и раскладывает их в нужные папки • Заходящие пользователи видят предпросмотр для картинок
  2. «Бонусы» при покупке сервисов • К домену прилагается N «стандартных»

    почтовых ящиков – клиент создает их сам при необходимости • При покупке хостинга квота на ящик увеличивается • Нужно обойти все созданные ранее ящики и увеличить им квоту – это долго – не относится напрямую к покупке хостинга • Чтобы дать клиенту воспользовать хостингом как можно быстрее: – создаем только хостинг и уведомляем об успехе – задачу по изменению квоты почтовых ящиков передаем другому процессу
  3. Очередь задач (сообщений) • Передача сообщения от одного процесса другому

    (возможно, находящемуся на другом сервере) • Задачи обычно хранятся недолго • Процедуры «положить» и «взять» задачу из очереди должны выполняться быстро • Простота расширения • Надежность систем передачи и хранения
  4. Свободные решения • Queue::DBI — бэкенды, поддерживаемые DBI • Minion

    — поддержка разных бэкендов (SQL, MongoDB, файлы, write your own!) • Resque, Queue::Q — Redis backend • ZeroMQ — собственный бэкенд и протокол • RabbitMQ (и десятки других) — протокол AMQP
  5. AMQP — Advanced Message Queueing Protocol • Разработка начата в

    2003г. John O'Hara из JPMorgan Chase Bank • Цель: создать свободную реализацию протокола обмена сообщениями, который можно использовать в критически важных банковских задачах • Определяет как формат передачи данных, так и поведение клиентского и серверного ПО • Имеет множество реализаций на разных языках: – OpenAMQ – RabbitMQ – Apache Qpid – Red Hat Enterprise MRG
  6. Поставщики и потребители сообщений • Поставщик отправляет сообщения в обменник

    • Потребитель может: – просто «слушать» определенную очередь – создавать или уничтожать очереди – определять правила заполнения очередей – выбирать разные обменники, полностью меняя маршрутизацию сообщений внутри системы – подтверждать обработку сообщения или отказывать в его обработке
  7. Очередь сообщений (Message Queue) • Хранит сообщения на диске и

    доставляет их к одному или нескольким потребителям • Свойства: – частные или общие – постоянные или временные – созданные клиентом или сервером
  8. Обменник (Exchange) • Получает сообщения от поставщика (producer) • Направляет

    их в очередь(и) или в другой обменник в соответствии с заданными критериями и параметрами сообщений: – свойства сообщения (заголовки) • routing_key – содержимое • (Как вариант, может дропнуть сообщение или «вернуть» поставщику)
  9. Direct exchange • Очередь «привязывается» к обменнику по ключу K

    • Поставщик отправляет сообщение с ключом R • Сообщение передается в очередь если K == R • По умолчанию, все сообщения привязаны к безымянному обменнику, использующему имя очереди как routing_key
  10. Fanout exchange • Очередь привязывается к обменнику без аргументов •

    Поставщик отправляет сообщение в обменник • Сообщение передается в очередь сообщений безо всяких условий (то есть сообщение передается во все очереди, привязанные к обменнику)
  11. Topic exchange • Очередь привязывается к обменнику с шаблоном маршрутизации

    P – шаблон: 0 или более слов ([A-Za-z0-9]+), разделенных точками – * матчится с целым словом – # - 0 или более слов • Поставщик отправляет сообщение с ключом R • Сообщение передается в очередь, если R соответствует P
  12. Headers exchange • При привязке очереди к обменнику передается таблица

    аргументов с заголовками, которые должно иметь сообщение для попадания в эту очередь (и опционально их значения). routing_key не используется. • Поставщик отправляет сообщение с заголовками, содержащими таблицу имен и значений. • Если заголовки сообщения совпадают с требуемыми, оно попадает в очередь.
  13. Деплой • Самое трудное — убедить всех, что это нужно

    • Непривычно, что все приходится создавать программно – не забывать писать тесты для архитектуры
  14. Документация • Спецификация AMQP (0.9.1 — для RabbitMQ) • www.rabbitmq.com

    • https://metacpan.org • www.rubyamqp.info • www.rubybunny.info
  15. ?