Реализация блокирующих сообщений с Rabbitmq (или перехват между издателем и потребителем)
У меня есть 8 потребителей в очереди, и любой из них может получать сообщения и после обработки, это влияет на БД. Большинство сообщений может быть запущено асинхронно, но в некоторых сообщениях нам нужно прекратить использование очереди, пока это сообщение не будет полностью обработано одним из потребителей. В течение этого времени остальные 7 потребителей не должны потреблять из очереди.
Есть ли способ реализовать это в rabbitmq, а не на уровне приложений (что может быть очень сложно реализовать)?
1 ответ
Я не знаю строго изменений RabbitMQ, чтобы сделать эту работу. Однако, есть подход, который не требует модификации какого-либо старого кода, кроме переименования очереди, в которую производитель отбрасывает сообщения. Это требует написания нового потребителя:
- Создайте очередь с одним потреблением и обновите производителя, чтобы отправлять сообщения в эту очередь.
- Потребитель этой очереди должен обработать любое синхронное сообщение.
- Поскольку это один потребитель, все остальные сообщения будут блокироваться в очереди, пока не будет завершена обработка.
- Единственный потребитель должен переслать любые асинхронные сообщения в исходную очередь для обработки остальными восемью потребителями.
Поскольку единственный потребитель просто пересылает асинхронные сообщения, он может сделать это быстро и не должно быть проблем с пропускной способностью.