队列中未处理的项目修改DB状态 - 如何处理并发的数据请求?

时间:2014-10-15 17:47:31

标签: c# .net producer-consumer

对不起,如果标题有点奇怪 - 我不确定如何将我的问题压缩成适当的单行内容!

基本上,我在系统A上有一个消息队列,所有这些消息都通过来自系统B的多个实例的套接字接收并逐个处理。其中一些消息修改了系统A的数据库中的数据,该数据库代表了全球状态' (即系统A的状态和所有系统B实例)。

同时,系统B的实例可以发送状态请求'到队列的消息,当处理时,将数据从系统A的数据库返回到请求系统B以进行进一步处理。系统B的一个实例上的某些操作取决于系统B的一个或多个其他实例的状态。

显然,这里存在数据完整性问题。一旦“状态”请求'处理消息并返回数据,队列中可能有任意数量的未处理消息修改全局状态,导致返回的数据不可靠。

经过深思熟虑后,我非常确定在全球架构仍然如此的情况下,这个问题无法解决。有什么方法可以重构整个系统,这样就不再是问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

一种通用方法是通过系统创建单个数据路径,以便存在固定的上游到下游数据流,并且下游状态可能滞后于上游,但是没有机会进行不确定的排序(竞争条件)。

为此目的,是否可以重新构建以便:

1)向每个B推送(广播),而不是B轮询状态。在您确定时,轮询会为数据引入第二条路径并允许竞争条件。

2)一个B实例上的某些操作依赖于其他B"听起来像是在B之间进行通信的req-reply,它引入了备用数据路径和不确定性。 Bs是同行,因此其中没有明显的上游。但是 - 数据是否可以跨越Bs进行条带化,这样对于任何一条数据,一个B是主数据,它将有关该数据的更新推送到其他B?例如,B1是a-m的主设备,B2是n-z的主设备。因此,对于一段数据" q",数据流始终为A - > B2 - > B1和确定性,用A系统记录系统状态。

如果Bs耦合 - 例如,如果a-m数据依赖于n-z数据,则序列号(由传入消息上的A分配)可以帮助区分较新状态和较旧状态并防止旧数据覆盖较新。但细节取决于B-B相互作用的细节。

任何eurekas呢?