并发创建传奇
Concurrent creation of sagas
创建 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
可用于处理同一传奇的并发更新。
在编写了一些具有高度并发配置(worker 和并行性)的测试后,我可以看到当我期望只创建一个 sagas 时创建了多个 sagas。这可能是因为以下流程对多个传入消息并发执行而没有任何 "readlock":
- 处理消息 - 检查 saga 是否存在(基于相关属性)
- 未找到 saga - 创建 saga
我已经通读了 ISagaStore
(MongoDb,RavenDb)的不同实现,但是还没有找到任何机制来防止由于并发处理而导致创建多个 "identical" sagas收到的消息。
长话短说:
Rebus 中是否有任何机制或模式可用于防止由于并发处理消息而导致创建多个 "identical" sagas?
一种可能的解决方案是在插入时检查相同的相关性 properties/values?
(或者我对整个概念的理解是错误的 - 如果能帮助理解这一点,我将不胜感激)
Is there any mechanism or pattern in Rebus that could be used to prevent creation of multiple "identical" sagas caused by concurrent handling of messages?
是的!
一个 saga 持久化者——至少是一个遵守 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
可用于处理同一传奇的并发更新。
在编写了一些具有高度并发配置(worker 和并行性)的测试后,我可以看到当我期望只创建一个 sagas 时创建了多个 sagas。这可能是因为以下流程对多个传入消息并发执行而没有任何 "readlock":
- 处理消息 - 检查 saga 是否存在(基于相关属性)
- 未找到 saga - 创建 saga
我已经通读了 ISagaStore
(MongoDb,RavenDb)的不同实现,但是还没有找到任何机制来防止由于并发处理而导致创建多个 "identical" sagas收到的消息。
长话短说: Rebus 中是否有任何机制或模式可用于防止由于并发处理消息而导致创建多个 "identical" sagas?
一种可能的解决方案是在插入时检查相同的相关性 properties/values?
(或者我对整个概念的理解是错误的 - 如果能帮助理解这一点,我将不胜感激)
Is there any mechanism or pattern in Rebus that could be used to prevent creation of multiple "identical" sagas caused by concurrent handling of messages?
是的!
一个 saga 持久化者——至少是一个遵守 Rebus 契约测试的——应该强制所有相关属性的唯一性。
这会导致并发 插入 操作导致除了第一个之外的所有操作都回滚。