Возможно ли с RabbitMQ сохранить сообщение прямого обмена без каких-либо очередей? - PullRequest
0 голосов
/ 04 октября 2019

Интересно, возможен ли следующий сценарий:

  • Создать обмен типа direct
  • Опубликовать сообщение для этого обмена с ключом маршрутизации rk1
  • После этого:
    • Создать очередь, которая принимает сообщения с ключом маршрутизации rk1
    • Использовать опубликованное сообщение для обмена

Похоже, что если очереди нет, сообщение отбрасывается, и нет способа его получить.

Так что, в основном, я хочу иметь возможность создавать сообщения, когда нет присутствующих потребителей. И потреблять их через некоторое время.

Ответы [ 3 ]

2 голосов
/ 05 октября 2019

Похоже, что если очереди нет, сообщение отбрасывается и нет способа его получить.

Да, это правильно, но это только частьstory.

Сообщение queue - это место хранения сообщений, опубликованных на сервере. потребитель - это назначенный набор соединений для приема сообщений, помещенных в очередь. exchange - это просто место для отправки сообщений. Он содержит семантику маршрутизации, чтобы определить, какие сообщения попадают в очереди на сервере. Когда сообщение не может быть перенаправлено в очередь и / или получателя, существует различные семантики, которые могут применяться , но по умолчанию сообщение отбрасывается.

Варианты обращенияс невозможными сообщениями:

  • Альтернативный обмен - обозначает другой обмен, где сообщения могут быть сброшены, если они не могут быть направлены в очередь натекущий обмен. Это можно сравнить с тем, как работает TCP / IP, когда хост назначения недоступен в текущей подсети и трафик направляется на шлюз. Обратите внимание, что очередь должна быть привязана к альтернативному обмену для сообщения, которое должно быть сброшено. Типичным случаем может быть его настройка в качестве разветвленного обмена с одной очередью для перехвата всех сообщений, отправляемых в альтернативный обмен.
  • Обязательно или Немедленно - вернуть сообщение отправителю, если оно не может быть доставлено. Сервер не хранит сообщение.
    • Обязательно обозначает, что сообщение должно быть доставленным в очередь на момент публикации. Если сообщение не маршрутизируется, издатель получит basic.return.
    • Немедленно , указывающее, что, помимо доставки, должен быть немедленно направлен напотребитель в определенной очереди (например, он недостаточно хорош для того, чтобы его позже выбросили в очередь для получения - его нужно доставить конечному потребителю прямо сейчас .

В любом случае, если очереди нет, сервер не может сохранить сообщение.

0 голосов
/ 31 октября 2019

Другим решением может быть объявление очереди с привязкой после обмена и до публикации сообщения;таким образом, сообщение будет перенаправлено и сохранено, но вам, возможно, придется добавить несколько TTL (https://www.rabbitmq.com/ttl.html).

0 голосов
/ 05 октября 2019

Очередь сущностей - это та, которая должна содержать сообщения, поэтому без очереди сообщения будут потеряны.

Однако, если вы не создадите обмен с соответствующим ключом маршрутизации, вы можете использовать мертвыйособенность надписи в rabbitmq.

...