0

我们正在尝试构建一个系统,该系统在分担处理负载的不同机器上具有多个服务实例。

每个都将检查一个表,如果该表上有要处理的行,它将选择第一个,将其标记为正在处理,然后对其进行处理,然后将其标记为已完成。冲洗重复。

防止 2 个实例 A 和 B 执行以下操作的竞速条件的最佳方法是什么

A(1) 读表,找到要处理的第 1 行,B(1) 读表,找到要处理的第 1 行,A(2) 标记为行处理 B(2) 标记为行处理

在单个应用程序中,我们可以使用锁或互斥锁。

我可以将 A1 和 A2 放在一个事务中,是不是很简单,还是有更好、更快的方法来做到这一点?

我应该把它打开,这样步骤是:

A (1) 将下一行标记为我的处理 A (2) 将其返回给我处理。

我认为这之前必须已经解决了很多次,所以我正在寻找“标准”解决方案,如果有多个,好处和坏处。

4

1 回答 1

0

交易是一个很好的简单答案,但有两个可能的缺点:

1)您可能想检查数据库的细则。有时,默认的一致性设置并不能保证在所有可能的情况下都绝对一致。

2) 有时,与使用数据库对工作进行排队和分配工作相关的访问模式在数据库上是难以预料的。

一种可能性是查看可靠的消息队列系统,这似乎与您正在寻找的内容非常匹配——工作机器可以只从共享队列中读取工作。可能的起点是http://en.wikipedia.org/wiki/Message_queuehttp://docs.oracle.com/cd/B10500_01/appdev.920/a96587/qintro.htm

于 2012-09-14T18:20:59.907 回答