如何在MassTransit中分别配置请求超时和/或消息TTL



我的目标是从API网关向微服务发出请求响应。我希望请求是持久的(不过期(,但响应应该过期(如果在30秒内没有消费者收到响应,那么它应该过期(。我在API GW请求处理程序(请求范围(中使用RequestClient。默认情况下,MassTransit将超时设置为30s,在此时间之后,将从队列中删除请求。它在这里的MassTransit代码:https://github.com/MassTransit/MassTransit/blob/5e2a416384f005c392ead139f5c4af34511c56db/src/MassTransit/RequestTimeout.cs#L7.

首先,我试着在我的请求客户端中设置这样的超时(使用RabbitMQ(:

// on request client level
cfg.AddRequestClient<ICreateGroupPayload>(RequestTimeout.None);
// and/or
// on .GetResponse() level
var response = await _createGroupClient.GetResponse<ICreateGroupResult>(new
{
Name = payload.Name,
Description = payload.Description
}, new CancellationToken(), RequestTimeout.None);

但这两种选择都不起作用。静态消息具有默认的30秒TTL。

  1. 为什么它不能按预期工作?这里的消息TTL与RequestTimeout不同吗?如果是,为什么是30多岁
  2. 在我的情况下,我必须手动配置消息TTL吗
  3. 我希望请求客户端在30秒后自动超时,即使请求消息永远不会过期。这是内置的吗,或者我必须为超时编写一些自定义代码,或者如果我将过期的CancellationToken传递给.getResponse((就足够了

您可以在注册请求客户端时配置默认超时:

cfg.AddRequestClient<ICreateGroupPayload>(RequestTimeout.After(s:20));

然后,在发送请求时,您可以使用消息初始值设定项中的标头覆盖TimeToLive

var response = await _createGroupClient.GetResponse<ICreateGroupResult>(new
{
Name = payload.Name,
Description = payload.Description,
__TimeToLive = TimeSpan.FromYears(1)
}, httpContext.CancellationToken);

这将用新值替换默认值(默认情况下与请求超时匹配(。

最新更新