• Почему не запускается RabbitMQ server?

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

    @yarkin
    По номерам портов видно, что это другие подключения, рассматривали такой вариант, что RabbitMQ их всё-таки закрывает, но приложение успевает переподключиться?
    Ответ написан
    Комментировать
  • Как сделать exponential backoff в rabbitmq?

    @yarkin
    Если очень надо, чтобы "таймауты" делал RabbitMQ, то в ограниченной форме на помощь может придти расширение DLX, но нужны ещё дополнительные очереди для отстойников. RabbitMQ это универсальная очередь, он не может решать микро-требования для каждого варианта использования.
    Ответ написан
    Комментировать
  • Почему может зависать amqp consumer rabbitmq?

    @yarkin
    Я не знаток PHP, но ситуация выглядит похожей на то, что RabbitMQ ждёт подтверждения обработки сообщений, но консьюмер их не шлёт. Попробуйте рестартануть консьюмер, если он начнет получать те же сообщения снова, то проблема точно в этом. Если доступна веб-морда менеджмента RabbitMQ, то там можно найти точные сведения, что происходит сейчас.
    Ответ написан
    Комментировать
  • Типы обменников в rabbitmq и хранение сообщения при неактивном получателе?

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

    @yarkin
    Если клиент не закрывает соединение с конкретным инстансом (или если закрыл, то ответ не должен получить), то посмотрите в сторону RPC, вот с помощью чего оно работает, вот примеры.
    Если результат требует много вычислительных ресурсов и повторять нежелательно, то либо создавать очереди под каждого клиента, либо где-то кэшировать результат (например, в СУБД).
    Ответ написан
  • Rabbitmq очередь последнего состояния (lvc). Как ее реализовать?

    @yarkin
    Дополню по плагину, сам не использовал, но по описанию и коду можно сказать как оно работает.
    (1) Когда в такой обменник публикуется сообщение:
    - Сохраняется связка <routing_key>=<value> [code]
    - Дальше маршрутизация происходит так же как и у Direct обменника [code]
    (2) Когда к такому обменнику цепляется очередь:
    - По ключу связки ищется значение из внутренней базы
    - Сообщение с последним значение публикуется в очередь

    То есть, если Вам нужно сохранять состояние для N объектов через такой механизм, то для получаения придётся каждый раз делать N биндингов очереди на обменник, затем N раз убирать этот биндинг. А так же не забыть повесить ограничение на длину очереди, так как никому реальные сообщение не требуются.

    Как вариант можете форкнуть этот обменник и допилить его так, чтобы при публикации сохранялись только последние состояния (без дальнейшей публикации как Direct), а при подписке на обменник RabbitMQ засылал бы сразу все состояния :-)
    Ответ написан
    Комментировать
  • Haproxy разрывает соединение с queue-worker, в чем проблема конфига?

    @yarkin
    А что HAProxy пишет в логах? Что показывает termination_state? Протокол AMQP ключает в себя heartbeat'ы, они включены у вас?
    Ответ написан
    Комментировать
  • Для чего нужен обмен?

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

    @yarkin
    Тут всё зависит от задачи и терминологии. Например, "пользователь" может быть как какой-то объект системы, который не имеет прямого коннекта к RabbitMQ и отделен слоем другого ПО, так и быть непосредственно подключённым к нему. В первом случае на уровне RabbitMQ нужно будет иметь возможность различать типы промежуточного ПО (например, отправка сообщений по почте, по телеге и т.п.), возможно их группы (например, шардинг по регионам), а конкретный ID пользователя RabbitMQ знать совсем тут не нужно и он может быть частью тела сообщения. Во втором случае на уровне RabbitMQ уже нужно будет различать конкретных пользователей и ID уже должен быть частью метаданных, видных RabbitMQ.
    Дальше, если перейти от термина "пользователь" к термину "клиент" (например), то в первом случае количество клиентов будет равно количеству инстансов промежуточного ПО (например, 1000), а во втором случае - количеству конечных пользователей (например, 1 млн). И тут можно сказать, что для каждого клиента (или группы равнозначных воркеров) нужно создавать очередь. В первом случае их будет тысяча, а во втором - миллион.

    И да, очереди у RabbitMQ не самые лёгкие, по моему опыту (на версии 3.6-3.7) 10 тыс. очередей занимали около 800 МБ памяти.
    Ответ написан
    Комментировать
  • Как отправить сообщение конкретному консьюмеру?

    @yarkin
    Для RabbitMQ все консьюмеры одной очереди считаются равноправными, вся маршрутизация выполняется до очереди, то есть каждый отдельный сервис (один консьюмер или их группа) должен иметь свою очередь.
    Ответ написан
  • RabbitMQ: exchange должен быть отдельным файлом?

    @yarkin
    Exchange это объект сервера, клиент лишь должен знать его имя (строку) для отправки сообщения. Клиент может создавать новые эксченжи, для чего нужно предоставить больше информации RabbitMQ (например, тип), в мануалах это как раз и используют чтобы упроситить и показать всю конфигурацию явно. В реальном продакшене, имхо, лучше чтобы вся инфраструктура обменников и очередей была предподготовленна отдельными утилитами, но для небольших сервисов это большой оверхед и проще из кода всё создавать. Я бы рекомендовал посмотреть ещё в сторону такого решения.
    Ответ написан
    Комментировать
  • Как избавится от потери сообщений в RabbitMq?

    @yarkin
    Как упомянул Иван, Вам надо начать контролировать успешное получение сообщения RabbitMQ, для чего нужно включить специальный режим у канала отправки. Скорость отправки в таком режиме конечно будет намного ниже, чтобы это как-то улучшить (при условии что неважен порядок сообщений в очереди) можно:
    1) Открыть несколько каналов и вести параллельную отправку по ним
    2) Открыть канал без подтверждения отправки и с подтверждением, отправить в первый, к примеру, 999 сообщений, а затем во второй одно и ждать пока придёт подтверждение на последний (что-то может пойти не так, но выглядит рабочим).

    Дополнительно можно попробовать Lazy режим у очереди.
    Ответ написан
    Комментировать
  • Персистентные очереди - это одно и тоже, что и устойчивые очереди?

    @yarkin
    Вот в документации это вполне себе описано.
    Очередь может быть durable или transient. В первом случае брокер после перезапуска её восстановит, но это никак не связано с её содержимым. Сообщения восстановятся только если они были отправлены с флагом persistent. Метаданные объектов (очереди, обменники и т.п.) хранятся в Mnesia, тогда как сами сообщения отдельно и в другом формате.
    Ответ написан
    Комментировать
  • Rabbitmq проблема с пере отправкой просроченными сообщениями. что не так?

    @yarkin
    1. exchange != queue, у Вас и то, и то, или же только очереди?
    2. Чтобы что-то оценить, нужны сами параметры очередей и их значения, иначе только пальцем в небо.
    Ответ написан
  • Как правильно сделать задержку в rabbitmq?

    @yarkin
    Указанное решение в принципе рабочее (встречал такое в своей практике), но есть вероятность, что специализированный плагин будет работать эффективнее (но точно не скажу, просто предположение).
    Плагин находится "под присмотром" официальных разработчиков, так что проблем с ним быть не должно. Инструкция по установке плагинов, собранный плагин есть, например, вот тут (в zip архиве файл .ez который понимает RabbitMQ).
    Ответ написан
    Комментировать
  • Как посмотреть и обработать сообщения с RabbitMQ?

    @yarkin
    Попробуйте вот такую штуку для отладки - Firehose Tracer. Какой ключ у биндинга сделали? Пробовали `#`?
    Ответ написан
    Комментировать
  • Какая правильная архитектура с message bus для клиент-серверной IoT-системы?

    @yarkin
    Я не работал с IoT-устройствами, но мне кажется, что отдельная локальная шина звучит логично, так как позволит иметь наименьшие задержки и работать офлайн, а также, возможно, сэкономить батарею. Но зависит от задачи и ресурсов, может оказаться поначалу выгодней работать через серверв. RabbitMQ использовать на IoT-устройстве так себе идея, имхо, для простой отправки в маленьком масштабе он будет невыгоден по ресурсопотреблению.
    Ответ написан
    Комментировать
  • Может ли RabbitMQ выстраивать очереди для задач с групировкой?

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

    @yarkin
    Описание довольно общее дано у Вас.
    Со стороны сервера:
    1) Обработка данных занимает малое время и ответ ожидается в том же соединении? Если результурующий файл находится в памяти процесса, то тут проще некуда - записать данные в качестве ответа, выставив нужные заголовки ( Content-Type, Content-Length, Content-Disposition, если требуется). Если на диске, то либо читаем и делаем как в предыдущем предложении, либо отправляем ссылку на файл и следующим запросом с клиента его скачиваем. Также, если есть nginx перед нодой (другие веб-серверы тоже такое поддерживают), то можно воспользоваться штукой под названием X-Sendfile (чтобы не грузить ноду для отдачи контента с диска).
    2) Если обработка занимает долгое время, то обычно клеинту сразу отвечают с каким-нибудь уникальным идентификатором запроса, по которому он периодически проверяет готовность (если нет других каналов для эффективной обратной связи) и получает ссылку на скачивание (которая далее обрабатывается либо nginx, либо тем же express-static).

    Со стороны клиента:
    1) Если запрос идёт через XHR, то, на сколько я помню, нужно использовать некоторые костыли, чтобы браузер показал клиенту диалог сохранения файла (гугл в помощь тут).
    2) Если стандартная отправка формы и сервер сразу отвечает файлом, то тут вообще ничего делать не надо (возможно потребуется заголовок Content-Disposition, иначе браузер может отобразить файл, если он умеет читать такой формат сам, плюс чтобы задать адекватное имя файлу).
    Ответ написан
    Комментировать