同时创造传奇

时间:2017-06-07 07:02:27

标签: rebus

创建sagapersister时,我必须实现ISagaStorage,它定义: Task<ISagaData> Find(Type sagaDataType, string propertyName, object propertyValue); Task Insert(ISagaData sagaData, IEnumerable<ISagaCorrelationProperty> correlationProperties); Task Update(ISagaData sagaData, IEnumerable<ISagaCorrelationProperty> correlationProperties); Task Delete(ISagaData sagaData);

实现插入时,ISagaData.Id可用于处理并发插入(如果是这种情况)。实现更新时,ISagaData.Revision可用于处理同一传奇的并发更新。

在使用高度并发配置(工作者和并行主义)编写一些测试之后,我可以创建多个传奇,当我希望只创建一个时。这可能是因为以下流程对多个传入消息执行并发而没有任何&#34; readlock&#34;:

  • 处理消息 - 检查是否存在传奇(基于相关属性)
  • 找不到传奇 - 创建传奇

我已阅读ISagaStore(MongoDb,RavenDb)的不同实现,但未能找到任何阻止创建多个&#34;相同&#34;的机制。由并发处理传入消息引起的传奇。

长话短说: Rebus中是否有任何机制或模式可用于防止创建多个相同的&#34;由并发处理消息引起的传奇?

一种可能的解决方案是在插入时检查相同的相关属性/值吗?

(或者我对整个概念的理解是错误的 - 在这种情况下,我将不胜感激任何理解这一点)

1 个答案:

答案 0 :(得分:1)

  

Rebus中是否有任何机制或模式可用于防止因并发处理消息而导致产生多个“相同”的传奇?

是的!

一个saga persister - 至少一个遵守Rebus合同测试 - 应该强制执行所有相关属性的唯一性。

这会导致并发插入操作导致除第一个之外的所有操作都回滚。