如何设置 RabbitMQ 来处理跨消费者的同一资源上的异步任务,例如数据库更新?



例如,我们有一个处理一个数字和 2 个消费者的任务队列:

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

当消息被使用时,假设它执行一些异步操作,例如更新数据库中的数字。

my_number_table
---
number(int)

如果使用者 1 获取任务 1 并开始更新数据库中的行,而使用者 2 获取任务 2 并开始更新数据库中的同一行,数据库不会锁定吗?

我相信我希望任务 2 在任务 1 完成并且该号码首先成功保存到数据库中之前不会被任何消费者拾取。

  • 您可以通过为两个使用者创建两个不同的队列来解决问题。 并将所有相关任务发送到同一队列。 并确保只有一个消费者在访问该队列。 例如,如果您希望 task2 应该仅在任务 1 之后启动,并向他们发送相同的队列队列 1。
  • 您可以通过对两个使用者使用一个队列并获取数据库上的锁来解决问题。 但是,您仍然无法确保保持执行顺序。 例如,消费者 1 具有非常高的延迟,而消费者 2 具有低延迟,因此任务 2 将在任务 1 到达消费者 1 之前到达消费者 2。当消费者 1 获取锁时,消费者 2 可能已完成任务2。

因此,根据我的理解,最好将依赖任务发送给同一个消费者。

最新更新