Запланированное сообщение RabbitMQ и функция отзыва

Можно ли запланировать сообщение с помощью RabbitMQ, а также удалить сообщение (которое планируется обработать) при соблюдении определенных условий? У нас есть требование, когда нам нужно вызвать внешнюю службу для получения некоторых данных. Вызов асинхронный. Клиент вызывает конечную точку API сервера, сообщая о необходимых ему данных. Сервер просто отвечает, подтверждая, что он получил запрос от клиента. Внутренне сервер также начинает обработку клиентского запроса и вызывает конечную точку клиентского API с фактическим ответом на запрос, который он получил когда-то обратно от клиента.

Существует ограничение по времени (30 секунд), пока клиенту не нужно ждать ответа от сервера. Если клиент получит ответ в течение 30 секунд, он продолжит выполнение. Даже если клиент не получит ответа от сервера в течение 30 секунд, он продолжит выполнение других шагов.

Каждую секунду между клиентом и сервером происходят тысячи независимых транзакций (запрос и ответ). Как клиент может наиболее эффективно отслеживать запросы и полученные ответы с помощью RabbitMQ. Может ли плагин RabbitMQ rabbitmq_delayed_message_exchange использовать для этого сценария, в котором клиент будет помещать новые сообщения в очередь вместе с заголовком x-delay (30 секунд)? Как можно удалить запланированное сообщение из очереди, если клиент получает ответ от сервера до 30 секунд?


person Rahul Malu    schedule 18.08.2020    source источник
comment
Вы контролируете и клиента, и сервер?   -  person Adam    schedule 19.08.2020
comment
Сервер - это внешняя служба, которая через некоторое время отвечает на запрос клиента. Сервер не контролируется. Под нашим контролем находится только клиент, который инициирует запрос и принимает ответ от сервера.   -  person Rahul Malu    schedule 24.08.2020


Ответы (1)


Я бы сделал следующее:

  1. Сделайте так, чтобы ответ также проходил через RabbitMQ (используя RPC)
  2. Убедитесь, что имя очереди ответов также отправляется в качестве параметра, который используется для маршрутизации с помощью какой-либо политики обмена (ключ маршрутизации или использование обмена заголовками)
  3. Настройте обмен DLX с правильной политикой для 2.
  4. Установите TTL 30 секунд в очереди клиент- ›сервер.

Как это работало в обычном случае?

  1. Клиент создает очередь ответов
  2. Клиент отправляет запрос на сервер
  3. Клиент потребляет из очереди ответа
  4. Сервер потребляет сообщение и отправляет ответ в очередь ответов.

Что случится с таймаутом?

  1. Клиент создает очередь ответов
  2. Клиент отправляет запрос на сервер
  3. Клиент потребляет из очереди ответа
  4. Запросить триггеры TTL сообщения
  5. RMQ отправляет сообщение запроса в очередь ответа
  6. Клиент получает свой запрос вместо ответа
person José M    schedule 22.08.2020