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

C# 队列中未处理的项修改数据库状态-如何处理并发的数据请求?,c#,.net,producer-consumer,C#,.net,Producer Consumer,抱歉,如果标题有点奇怪-我不知道如何将我的问题适当地浓缩成一行 基本上,我在系统a上有一个消息队列,所有消息都是通过套接字从系统B的几个实例接收并逐个处理的。其中一些消息修改了系统A数据库中的数据,该数据库表示“全局状态”(即系统A和所有系统B实例的状态) 同时,系统B的实例可以向队列发送“状态请求”消息,队列在处理时将数据从系统A的数据库返回给请求系统B进行进一步处理。系统B的一个实例上的某些操作取决于系统B的一个或多个其他实例的状态 显然,这里存在数据完整性问题。一旦处理“状态请求”消息并返

抱歉,如果标题有点奇怪-我不知道如何将我的问题适当地浓缩成一行

基本上,我在系统a上有一个消息队列,所有消息都是通过套接字从系统B的几个实例接收并逐个处理的。其中一些消息修改了系统A数据库中的数据,该数据库表示“全局状态”(即系统A和所有系统B实例的状态)

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

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

经过深思熟虑,我非常确信,在全球架构保持不变的情况下,这个问题是无法解决的。我有没有办法重组整个系统,使其不再成为问题


谢谢

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

为此,是否有可能重新构建,以便:

1) A向每个B推送(广播),而不是B轮询状态。正如您所确定的,轮询引入了第二条数据路径,并允许竞争条件

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

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


有什么新发现吗?

读写比是多少?@tariksbl:这是可变的,但在任何给定点上,写的数量都远远高于读的数量(~50:1)。写作是经常发生的,但阅读是偶尔发生的。非常感谢——你给了我很多思考的食物。还没有,但我想我还没有完全消化你的建议(!)。