【发布时间】:2012-09-17 09:53:50
【问题描述】:
我在使用 nservicebus 实施工作流程过程中遇到问题,我使用版本 2.0.1329.2 并且我尝试实施的工作流程非常简单:
我有一个需要计算的文章列表,工作流程从发布的第一个列表开始。之后,用户可以进行其他发布,从原始列表中添加或删除一些文章。每个列表都有一个代码标识符。
我已经使用由列表代码标识的编排服务来实现它。在传奇数据中,也有列出列表的所有文章的引用。
问题在于:当用户发布文章列表时,当同一列表的另一个发布正在进行时,没有任何进程状态锁定,这样就没有并发控制,但处理程序将完成稍后将有自己的数据持久化。
例如:
- 在时间 [t] 到达的 10 篇文章列表,编排服务从数据库中加载 saga 数据,在时间 [t + 5] 修改并存储它
- 添加 1 项的列表在时间 [t+1] 到达,编排服务从数据库中加载 saga 数据,在时间 [t+4] 修改并存储它
在时间 [t+6] 我应该添加 6 个元素,但我只添加了 5 个元素..
我认为行为应该是这样的:如果与同一个列表相关,第二个消息应该找到进程状态锁定,直到第一个完成。否则如果与另一个列表相关,则应该并行处理。
为此,我想知道编排服务是否没有适当地支持工作流流程的实现,除非将工作线程的数量设置为只有一个会失去并行效率。
【问题讨论】:
-
您使用的隔离级别是多少?使用可序列化,包含 10 篇文章的第一条消息应该无法保存并重新处理。
-
在哪里可以设置不同的隔离级别?无论如何,消息 1 失败并且重新处理不是正确的轨道,因为以这种方式假设在第二条消息中我不想只添加 1 个项目,而是要删除 3 个。消息 2 将首先被处理,并且在消息 1 的处理发生更改会迷路了。
-
已删除邮件有一个墓碑的概念。搜索矢量时钟和墓碑。 Microsoft Sync 框架解释得还不错here
标签: nservicebus saga