• Как задать кастомную политику переполнения Rabbit (pika)?

    @yarkin
    В дополнение к предыдущему ответу можно ещё добавить вот такой механизм - Dead Letter Exchanges.
    Ответ написан
    Комментировать
  • Есть ли Стратегия борьбы со сбросом состояния RabbitMQ?

    @yarkin
    1) Разработчики RabbitMQ ко всем потерям данных на стороне самого RabbitMQ относятся критично, так что, если в какой-то момент будете уверены, что теряет данные именно он, то смело создавайте баг (с подробностями как повторить).
    2) Если админы не умеют настраивать стейтфул приложения в контейнерной среде или куча ручных операций, то это больше административная задача, чтобы научиться и, например, использовать шаблоны/чарты/т.п. для предотвращения сюрпризов. Но также RabbitMQ в контейнере нужно настраивать, чтобы не получать деградации и дампов.
    3) Со стороны самого RabbitMQ есть зеркалирование очередей (queue mirroring) для дублирования данных, что позволит внезапно терять ноды (но восстановление может обойтись высоким потреблением процессора).
    4) Также рекомендую логировать и идентифицировать каждое отправленное и полученное сообщение, чтобы оценивать проблему. Для большей достоверности можно включить логирование ещё и на уровне RabbitMQ (если позволяют ресурсы). На прошлой работе у нас был свой плагин для RabbitMQ, который получал копию всех полученных и отправленных сообщений, выгребал из них нужную метаинформацию и отправлял в Graylog.
    5) Ну и конечно нужно делать отправку и приём с подтверждением, но это, я думаю, Вы и без меня уже делаете.
    Ответ написан
    4 комментария
  • Почему у rabbitmq такая низкая производительность?

    @yarkin
    В гугле по словам "rabbitmq" и "rpc" выдаётся ссылка на оф.документацию по Direct reply-to, Вы пробовали такой механизм? Создание/удаление очереди ради получения одного ответа это очень накладно. 50/400rpc это вообще не о чём, даже для RabbitMQ (конечно всё зависит от выделенных ресурсов, хранению на диске и т.д.).
    Ответ написан
    2 комментария
  • Возможно ли увеличить максимальное значение клиентов RABBITMQ больше 65535?

    @yarkin
    С серверной стороны используется всего 1 порт, это клиентская часть выбирает случайный (по умолчанию), так что количество клиентов, которое может обслужить сервер RabbitMQ (да и любой другой сервис) не ограничено лимитом портов. (Например, в Linux каждое соединение характерирузется 5 параметрами {proto, src_ip, scr_port, dst_ip, dst_port}.)

    Ограничение дают вычислительные ресурсы, которыми распоряжается RabbitMQ. Так как очереди в RMQ не самые простые, то они потребляют достаточно памяти, я бы сказал, что каждая очередь (при условии что там немного сообщений) потребляет 30-50 КБ RAM. Можно попробовать включить режим Lazy Queue, чтобы RQM всегда писал/читал с диска и не кэшировал сообщения в памяти. Также RMQ любит процессор, но может хорошо распределить нагрузку между всеми ядрами.

    В кластерном режиме RabbitMQ может распределить очереди по всем серверам и обслуживать клиента на любом из них (но балансить клиентов также надо по всем узлам, в идеальности "привязать" клиента к одному серверу). Но проблемы начнутся, когда узлы RMQ начнут "падать" :-) Плюс метадата об очередях синхронизируется между всеми серверами, так что, если поток команд на создание/удаление очередей будет высок, то только на этом может съесться куча процессора и сети.
    Ответ написан
    Комментировать
  • Как в RabbitMQ отправить сообщение не всем, а только одному подписчику?

    @yarkin
    Принцип очереди в RabbitMQ - сообщение получает только один подписчик, так что, если у Вас действительно одна очередь (а не подписка из каждого приложения на обменник, при которой создаётся отдельная очередь для каждого подписчика), то проблем быть не должно.
    Ответ написан
    Комментировать
  • Как аутентифицировать пользователя приложения при подключении к RabbitMQ по протоколу WEB-STOMP?

    @yarkin
    Boris Korobkov дал ценное замечание по поводу того, что всем должен рулить сервер и нужно добавить элемент случайности в имена, дополню его несколькими рекомендациями.

    1) Если очередь будет создана сервером, то auto-delete не будет работать, если клиент не подпишется на неё.
    2) Не забывайте, что если два клиента (например, две вкладки или две сессии одного пользователя) подключатся к одной очереди, то сообщение получит только один из них. В своих решениях я использовал подход, что очередь создавалась клиентом, а обменник сервером, но необходимо убедиться, что до RabbitMQ доходят только легитимные запросы (от авторизованных клиентов) и пользователь ограничен в правах создавать только нужные очереди и подписывать их на нужные обменники.
    3) Рекомендовал бы не выставлять порт web-stomp плагина без доп.защиты (например, HAProxy), которая позволит защитить RabbitMQ от перегрузки подключениями.

    P.S. Писал статью на Хабр год назад о подобной системе, может быть что-то будет интересное в ней ещё - https://habr.com/post/341068/
    Ответ написан
  • Как отфильтровать очередь (Unacked -> Ready)?

    @yarkin
    Странная ситуация, если тут Вам не помогут, попробуйте задать вопрос в официальной гугл-группе. А delivery-tag при nack'е идёт от последнего полученного сообщения? И не забывайте, что сервер больше не пришлёт эти сообщения в тот же канал:
    The server MUST NOT deliver the message to the same client within the context of the current channel.
    Ответ написан
  • Как конфигурировать очереди в RabbitMQ через конфиг?

    @yarkin
    Если менеджмент плагин включён, то можно его возможностями воспользоваться для создания/конфигурирования объектов при старте. Пример этого файла можно получить экспортировав определения из webui (внизу страницы было).
    Ответ написан
    1 комментарий
  • Зачем нужен RPC в сервере очередей?

    @yarkin
    Что подразумевается под RPC, Remote Procedure Call? Если так и вопрос появился, например, после просмотра одного из туториала, то это один из паттернов взаимодействия в распределённых приложениях, в котором RabbitMQ Вам сможет помочь. У него "из коробки" есть расширение, которое позволяет получить результат выполнения функции, без создания дополнительных объектов в брокере.
    Ответ написан
  • Как репликация RabbitMQ согласуется с балансировкой нагрузки?

    @yarkin
    1) Уровень очередей, мастеры очередей могут быть на разных нодах, вот тут описано, как Вы можете повлиять на процесс выбора мастера.

    2) Вы можете отправлять/получать сообщения с любой ноды, даже если на ней нет ни мастера, ни слейва этой очереди, RabbitMQ сам спроскирует куда нужно (соответственно внеся некие задержки в запрос). Для работы через HAProxy в последних версиях есть поддержка протокола PROXY, чтобы в менеджмент консоле можно было видеть реальные адреса клиентов, а не адреса прокси.
    Ответ написан
  • Есть ли аналоги rabbitmq (каллбеки, удаление из очереди)?

    @yarkin
    Для RabbitMQ есть встроенное расширение Direct reply-to, есть пример его использования.
    Ответ написан
    Комментировать
  • Как организовать динамическое добавление consumer-ов для rabbit-mq?

    @yarkin
    К очереди в RabbitMQ могут быть подключены одновременно несколько потребителей (consumers), но сам RabbitMQ никак не связан с их масштабированием. Понять, что текущие потребители не справляются со своей задачей, можно по анализу размера очереди (количеству сообщений в ней). Саму задачу масштабирования, скорей всего, надо решать на уровне какой-нибудь контейнерной виртуализации (например, docker), это будет проще и быстрей.
    Ответ написан
  • Как организовать достраивание сообщения несколькими сервисами?

    @yarkin
    Какой-то сложный алгоритм, имхо.
    Заранее известно определение "полноты" объекта? Если известен список сервисов, почему не обратиться к ним напрямую и по итогу ответов от каждого сформировать "полный" объект?
    В общем нужен какой-то "редьюсер" ответов, из коробки у RMQ не знаю каких-то подходящих механизмов для этого.
    Ответ написан
  • Как сделать протухание сообщений в очереди RabbitMQ?

    @yarkin
    Задать время жизни можно с помощью www.rabbitmq.com/ttl.html (самое простое повесить политику).
    Чтобы протухшее сообщение не просто удалилось, а попало в другую очередь можно воспользоваться этим www.rabbitmq.com/dlx.html
    Ответ написан
    Комментировать
  • RabbitMQ: Как получить только часть сообщений?

    @yarkin
    1) Использовать basic_get вместо basic_consume, эта штука получает всего лишь одно сообщение за вызов, пример использования - https://github.com/php-amqplib/php-amqplib/blob/ma...
    2) Сделать счётчик полученных сообщений и при достижении 10 закрыть канал.
    Ответ написан
  • RabbitMQ: Как сохранить сообщение в очереди?

    @yarkin
    Если я понимаю верно, то при создании очереди (queue_declare) в качестве имени указывается пустая строка, на что RabbitMQ создаёт для неё случайное имя и добавляет флаг exclusive, вследствие чего очередь удаляется при закрытии подключения клиентом. Попробуйте дать собственное имя для очереди и посмотрите параметры вызова этого метода.
    Ответ написан
  • Как отследить завершение очереди RabbitMQ?

    @yarkin
    Если хочется реализовать всё через очередь, где каждый элемент это товар, то как вариант создать временную очередь, заполнить её новыми товарами, а потом сообщить дальше её имя. Если интересно уведомление о завершении импорта также получить через RMQ, можно создать обменник, а основной процесс создаёт себе служебную очередь и подписывается на этот обменник.
    Но, имхо, если импорт происходит в одном процессе, а генерация кэша по одному элементу это очень дешёвая операция, то вероятно не очень эффективно размещать каждый товар отдельно, лучше складывать их пачками, чтобы также пачку и обработать.
    Ответ написан
  • Возможно ли создать потребителя RabbitMQ без определения exchange?

    @yarkin
    На Java не пишу, но: а Вы не пробовали убрать те три строчки, где используется exchange? Это приводит к ошибке?

    Проблема будет в том, что очередь и обменник нужно будет связать (создать биндинг), это можно сделать при создании очереди или при создании обменника, ну или в какой-то третий момент времени. Если этого не сделать, то сообщения, публикуемые в обменник не попадут в очередь.
    Но, если требуется просто очередь, без какой-то реальной потребности в обменнике, то при публикации можно использовать обменник по умолчанию (пустая строка) и имя очереди в качестве ключа маршрутизации и RabbitMQ закинет сообщение в эту очередь.
    Ответ написан
    Комментировать
  • Как правильно организовать отказоустойчивость при работе к кластером RabbitMQ?

    @yarkin
    На уровне данных. Когда поднимается ResplicaSet в MongoDB, она понимает, что данные нужно дублировать на несколько нод. Когда создаётся кластер RabbitMQ (по факту это кластер Erlang-машин), то по всем машинам дублируются лишь метаданные (информация об обменниках, очередях и т.п.), но сами данные остаются жить на одной ноде (но прозрачно передаются/забираются, если клиент подключён к другой ноде кластера). У них есть статья в доке по отказоустойчивости к потери данных.

    На уровне коннектов. Драйвер MongoDB открывает подключения до каждой ноды ReplSet (может быть лишь до какого-то их количества, не уверен точно) и, в зависимости от операции и её параметров, использует то или иное подключение. То есть поддержка ReplSet заложена на уровне драйвера. RabbitMQ работает на протоколе AMQP (нативный), который работает только с одной нодой брокера, скорее всего есть куча библиотек, которые обёртывают в себе подключение к нескольким серверам RabbitMQ (либо один коннект и другой поднимается по отказу первого, либо сразу несколько коннектов, которые дают балансировку и малый лаг при отказе одной ноды). Но, если нет либы для работы с несколькими нодами, то сделать её, думаю, особых проблем не составит.
    Ответ написан
    Комментировать