C# MassTransit saga在部署到测试服务器时具有请求/响应超时

C# MassTransit saga在部署到测试服务器时具有请求/响应超时,c#,asp.net-core,masstransit,C#,Asp.net Core,Masstransit,我有一个完整的MassTransit saga,它运行一些命令,然后执行一个请求/响应调用来查询数据库,然后最终将响应返回给调用的控制器 在本地,这一切现在99%的时间都有效(感谢我在这里得到的很多支持)。然而,当部署到my Azure VM时,它有一个RabbitMQ的本地副本和运行在其上的2个ASP.NET核心服务,对saga的第一次调用会立即进行,但所有后续调用都会超时 我觉得这可能与我正在使用InMemorySagaRepository有关(理论上,对于我的用例来说,这应该很好) 该传奇

我有一个完整的MassTransit saga,它运行一些命令,然后执行一个请求/响应调用来查询数据库,然后最终将响应返回给调用的控制器

在本地,这一切现在99%的时间都有效(感谢我在这里得到的很多支持)。然而,当部署到my Azure VM时,它有一个RabbitMQ的本地副本和运行在其上的2个ASP.NET核心服务,对saga的第一次调用会立即进行,但所有后续调用都会超时

我觉得这可能与我正在使用InMemorySagaRepository有关(理论上,对于我的用例来说,这应该很好)

该传奇最初是这样配置的:

InstanceState(s => s.CurrentState);

Event(() => RequestLinkEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => LinkCreatedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => CreateLinkGroupFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => CreateLinkFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));
Event(() => RequestLinkFailedEvent, x => x.CorrelateById(context => context.Message.LinkId));

Request(() => LinkRequest, x => x.UrlRequestId, cfg =>
{
            cfg.ServiceAddress = new Uri($"{hostAddress}/{nameof(SelectUrlByPublicId)}");
            cfg.SchedulingServiceAddress = new Uri($"{hostAddress}/{nameof(SelectUrlByPublicId)}");
            cfg.Timeout = TimeSpan.FromSeconds(30);
});
值得注意的是,我的LinkId始终是唯一的Guid,因为它是在发送消息之前在控制器中创建的

另外,当我重新启动apppool时,它会在第一次调用时再次工作,然后再次开始超时


我觉得有些东西可能在某个地方被锁定了,但我无法在本地复制它

所以我想在这里发布我自己问题的解决方案,希望它将来能帮助其他人

我做了3个根本性的改变,无论是单独还是组合解决了这个问题,现在无论我使用InMemorySagaRepository、Redis还是MongoDB,一切都在100%的时间里运行

问题1 正如我在这里发布的另一个问题中所详述的:

在我的SagaStateMachineInstance类中,我错误地将CurrentState属性声明为“State”类型,而它本应是字符串:

public string CurrentState { get; set;}
这是一个基本问题,当我开始尝试添加持久性时,它就暴露了出来,因此在使用InMemorySagaRepository时,它可能也会带来麻烦

问题2 事后看来,我怀疑这可能是我的主要问题,我并不完全相信我已经用最好的方式解决了它,但我对事情的进展感到满意

我确保我的最后一项活动在所有州都得到管理。我想发生的事情是我的请求/响应在传奇的当前状态更新之前就完成了。我意识到这一点,因为我尝试使用MongoDB作为我的持久性,并且看到我的传奇故事没有完成,而是停留在倒数第二的状态

问题3 这应该是不必要的,但我想添加它作为有问题的人考虑/尝试的东西

我从我的传奇中删除了请求/响应步骤,并将其替换为发布/订阅。为此,我向我的消费者发布了一个事件,该事件完成后将发布一个带有CorrelationId的事件(正如@alexey zimarev在我的另一期文章中所建议的)。因此,在执行查询(即reuqest)的消费者中,我在查询完成后执行以下操作:

context.Publish(new LinkCreatedEvent { ... , CorrelationId = context.Message.CorrelationId })
因为CorrelationId在那里,所以我的saga会将其拾取并处理事件:

When(LinkCreatedEvent )
   .ThenAsync(HandleLinkCreatedEventAsync)
   .TransitionTo(LinkCreated)
我真的很高兴这一切现在是如何运作的,并对将解决方案付诸实施充满信心