Реализация блокирующих сообщений с Rabbitmq (или перехват между издателем и потребителем)

У меня есть 8 потребителей в очереди, и любой из них может получать сообщения и после обработки, это влияет на БД. Большинство сообщений может быть запущено асинхронно, но в некоторых сообщениях нам нужно прекратить использование очереди, пока это сообщение не будет полностью обработано одним из потребителей. В течение этого времени остальные 7 потребителей не должны потреблять из очереди.

Есть ли способ реализовать это в rabbitmq, а не на уровне приложений (что может быть очень сложно реализовать)?

1 ответ

Я не знаю строго изменений RabbitMQ, чтобы сделать эту работу. Однако, есть подход, который не требует модификации какого-либо старого кода, кроме переименования очереди, в которую производитель отбрасывает сообщения. Это требует написания нового потребителя:

  1. Создайте очередь с одним потреблением и обновите производителя, чтобы отправлять сообщения в эту очередь.
  2. Потребитель этой очереди должен обработать любое синхронное сообщение.
  3. Поскольку это один потребитель, все остальные сообщения будут блокироваться в очереди, пока не будет завершена обработка.
  4. Единственный потребитель должен переслать любые асинхронные сообщения в исходную очередь для обработки остальными восемью потребителями.

Поскольку единственный потребитель просто пересылает асинхронные сообщения, он может сделать это быстро и не должно быть проблем с пропускной способностью.

Другие вопросы по тегам