Как настроить RabbitMQ для обработки асинхронных задач на одном и том же ресурсе среди потребителей, таких как обновления базы данных? - PullRequest
0 голосов
/ 15 октября 2018

Например, у нас есть очередь задач, которые обрабатывают число и 2 потребителя:

             |-> c1
[5,4,3,2,1] - 
             |-> c2

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

my_number_table
---
number(int)

Если потребитель 1 получает задачу 1 и начинает обновлять строку в базе данных, а потребитель 2 получает задачу 2 и начинает обновлять ту же строку в базе данных, не блокируется ли база данных?

Полагаю, я бы хотел, чтобы задача 2 не была подхвачена каким-либо потребителем до тех пор, пока задача 1 не будет выполнена и номер не будет успешно сохранен в базе данных.

1 Ответ

0 голосов
/ 16 октября 2018
  • Вы можете решить свою проблему, создав две разные очереди для двух потребителей.и отправьте все зависимые задачи в одну очередь.а также убедитесь, что только один потребитель получает доступ к этой очереди.Например, если вы хотите, чтобы задача 2 запускалась только после задачи 1 и отправляла обеим очереди одну и ту же очередь 1.
  • , вы можете решить свою проблему, используя одну очередь для обоих потребителей и получая блокировку базы данных.но, тем не менее, вы не можете гарантировать, что порядок выполнения сохраняется.например, потребитель1 имеет очень высокую задержку, а потребитель2 имеет низкую задержку, поэтому задача 2 достигнет потребителя 2, прежде чем задача 1 достигнет потребителя1.К тому времени, когда потребитель1 получает блокировку, потребитель2 может завершить задачу2.

Поэтому, насколько я понимаю, лучше отправить зависимое задание тому же потребителю.

...