【问题标题】:How to configure request timeout and/or message TTL separately in MassTransit?如何在 MassTransit 中分别配置请求超时和/或消息 TTL?
【发布时间】:2021-04-21 18:01:40
【问题描述】:

我的目标是从 API 网关到微服务的请求-响应。我希望请求是持久的(不会过期),但响应应该过期(如果没有消费者在 30 秒内收到响应,那么它应该过期)。我在 API GW 请求处理程序(请求范围)中使用 RequestClient。默认情况下,MassTransit 将超时设置为 30 秒,然后从队列中删除请求。它位于 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);

但是这些选项都不起作用。静态消息的 TTL 默认为 30 秒。

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

【问题讨论】:

    标签: masstransit


    【解决方案1】:

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

    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);
    

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

    【讨论】:

    • 嗯,好像不行。像你说的那样尝试过,也像这样在 PublishFilter 中尝试过: context.TimeToLive = TimeSpan.FromDays(2); .但是不管什么消息总是有 30s 的 TTL。还尝试为 __TimeToLive(而不是 TimeSpan)设置毫秒,但它也不起作用。此外,当我在 PublishObserver 中记录消息时,它显示 00:00:30 TTL。我正在使用 MT 7.2.0-develop.3353。
    • 似乎__TimeToLive 仅在RespondAsync 中有效(在消费者中它会更改响应TTL)。在GetResponse(在请求客户端中)__TimeToLive 被忽略,但可以通过将第三个参数传递给GetResponse(values, cancelationToken, requestTimeout) 来更改 TTL。是否可以不在消息上设置任何 TTL?我的意思是我想避免设置 TimeSpan.FromYears(100) 例如:)。目前我还没有弄清楚如何“不设置”TTL。
    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多