同步消息队列

时间:2016-11-08 12:05:48

标签: c# .net message-queue

我有一个系统需要完成一组操作,每个操作都有一个类型和一个实体。每个实体的操作可以独立完成,但在实体内,类型的顺序确实很重要。只有当前一种类型的所有操作都已完成时,才能启动对类型的操作。操作通常从数据库中获取一些数据,处理它,再次将结果存储在数据库中。

如果操作量需要并行使用多台机器,我怎样才能达到这种效果(最好是在.NET世界中)?

P.S。 现在我正在使用服务总线,每条消息都是一个操作实体类型的组合。这根本不符合我的需要,因为没有强制执行订单,并且当与消息连接的操作实际上已经完成时,它不清楚。

编辑: 我需要找到一种逻辑方式,以正确的顺序处理这些操作,保持所有(可以)并行。

实施例: 我需要为2个实体(E1,E2)做3种类型的操作(T1-T3)。可以有许多操作具有相同的类型和实体。

-- Entity 1
[T1, E1][T1, E1][T1, E1][T1, E1] - 4 operations Type 1, Entity 1
[T2, E1][T2, E1] - 2 ops, Type 2, Entity 1
[T3, E1] - 1 operation, Type 3, Entity 1
-- Entity 2
[T2, E2][T2, E2]
[T3, E2]

通常我可以将实体1与实体2并行处理。我也可以并行执行每个特定的[Tx,Ex](例如所有[T2,E1])。我需要保持类型的顺序,T1-> T2-> T3。 T2操作需要等到所有T1操作在实体中完成

2 个答案:

答案 0 :(得分:1)

也许你应该为每种类型的操作(消息)使用单独的队列。您按顺序处理此队列,并且仅在前一个队列为空时处理。 例如。有3个队列A,B和C.消费者检查A队列中是否有任何消息。如果是 - 消费者获得并处理。如果不是 - 它检查B队列。等等。 但是来自A队列的最后一条消息仍然可能存在问题 - 当B队列的消息开始时,它仍然可以处理。

类似的解决方案 - 使用消息优先级。但最后一条消息的问题仍然存在。

答案 1 :(得分:1)

如何在实体中保留一个状态,从而导致允许执行哪些类型的操作。

您将有一些工作人员将通过不同的线程分发操作,并且当不再执行某种类型的操作时将更改状态。

我认为可以检查启动的线程是否已完成,但您甚至可能希望将状态添加到操作中(例如,Queued,InProgress,Done)。

您可以只查询某个实体是否仍然具有某种类型的非“完成”操作,并且当它们全部完成时,更新实体的状态,允许下一类状态为Queued的操作出列并加工。

注意

仅当不变量认为不可能从一个状态转到前一个状态时才有效,这意味着只有当可能实体才能处理T1操作后,这才有效它完成了T2操作。实际上,这意味着不应该允许实体在开始处理后分配新的操作。