首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步消息队列

同步消息队列
EN

Stack Overflow用户
提问于 2016-11-08 12:05:48
回答 2查看 155关注 0票数 1

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

假设操作的数量需要并行使用许多机器,我如何才能达到这个效果(最好是在.NET世界内)?

现在我正在使用服务总线,每条消息都是一个操作实体类型的组合。这根本不满足我的需求,因为订单没有强制执行,并且不清楚与消息连接的操作何时实际完成。

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

示例:我需要为两个实体(E1、E2)执行3种类型的操作(T1-T3)。可以有许多具有相同类型和实体的操作。

代码语言:javascript
复制
-- 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操作都在实体中完成为止。

EN

回答 2

Stack Overflow用户

发布于 2016-11-08 15:38:29

也许您应该为每种类型的操作(消息)使用单独的队列。只有在前一个队列为空的情况下,才会按顺序处理此队列。例如:有3个队列A、B和C。消费者检查A队列中是否有任何消息。如果是的话-消费者会得到它并进行处理。如果没有-这是支票B队列。诸若此类。但是,来自A队列的最后一条消息可能仍然存在问题--它可能仍然会处理来自B队列的消息何时开始。

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

票数 1
EN

Stack Overflow用户

发布于 2016-11-08 15:52:38

如果您在实体中保留一个状态,这会导致哪些类型的操作被允许执行?

您将有一些工作人员将操作分布在不同的线程上,并且在没有需要执行的特定类型的操作时更改状态。

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

您只需查询一个实体是否仍有某些类型的未“完成”的操作,当它们全部完成后,更新该实体的状态,允许状态排队的下一种操作被排出队列并进行处理。

备注

只有当不变量认为不可能从一种状态转到前一种状态时,这才有效,这意味着只有当实体在完成T1操作之后无法处理T2操作时,这才能起作用。在实践中,这意味着不应该允许实体在开始处理后获得分配的新操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40486527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档