将 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.