将 InMemorySagaRepositoryProvider 与 MongoDbRepository 与 MassTransit 一起使用时的不同行为
Different behavior when using InMemorySagaRepositoryProvider vs MongoDbRepository with MassTransit
当我从
更改时,我遇到了不同的行为
x.SetInMemorySagaRepositoryProvider();
到
x.AddSagaStateMachine<FormRequestStateMachine, FormRequestState>()
.MongoDbRepository<FormRequestState>(r =>
{
r.Connection = "mongodb://admin:SOMEPASSWORD@127.0.0.1";
r.DatabaseName = $"public@tenants@{tenant.Id}";
r.CollectionName = "FormRequestState";
});
在我的状态机中
Initially(
When(CreateNewRequest)
.Then(x =>
{
x.Publish(new GenerateMagicLink() { CorrelationId = x.Message.CorrelationId });
}).TransitionTo(Created));
During(Created,
When(GenerateMagicLink)
.Then(x =>
{
x.Saga.MagicLink = new Guid().ToString();
}));
这段代码适用于内存,但不适用于 Mongo 实现。
知道为什么吗?
悲观并发和乐观并发的区别。为了帮助您解决问题,您应该 始终 在处理 sagas 时使用 in-memory 发件箱,并结合消息重试。一切都在文档中,但本质上是:
cfg.UseMessageRetry(r => r.Interval(100,500,1000,5000));
cfg.UseInMemoryOutbox();
这将确保在 saga 正确保存到 MongoDB 之前不会生成您的消息。
The in-memory saga repository only supports pessimistic locking.
当我从
更改时,我遇到了不同的行为x.SetInMemorySagaRepositoryProvider();
到
x.AddSagaStateMachine<FormRequestStateMachine, FormRequestState>()
.MongoDbRepository<FormRequestState>(r =>
{
r.Connection = "mongodb://admin:SOMEPASSWORD@127.0.0.1";
r.DatabaseName = $"public@tenants@{tenant.Id}";
r.CollectionName = "FormRequestState";
});
在我的状态机中
Initially(
When(CreateNewRequest)
.Then(x =>
{
x.Publish(new GenerateMagicLink() { CorrelationId = x.Message.CorrelationId });
}).TransitionTo(Created));
During(Created,
When(GenerateMagicLink)
.Then(x =>
{
x.Saga.MagicLink = new Guid().ToString();
}));
这段代码适用于内存,但不适用于 Mongo 实现。 知道为什么吗?
悲观并发和乐观并发的区别。为了帮助您解决问题,您应该 始终 在处理 sagas 时使用 in-memory 发件箱,并结合消息重试。一切都在文档中,但本质上是:
cfg.UseMessageRetry(r => r.Interval(100,500,1000,5000));
cfg.UseInMemoryOutbox();
这将确保在 saga 正确保存到 MongoDB 之前不会生成您的消息。
The in-memory saga repository only supports pessimistic locking.