MassTransit - 从请求响应中获得响应,但从跳过的队列中添加和删除消息?

时间:2021-05-14 10:15:28

标签: c# rabbitmq masstransit request-response

我看不出有什么可以说这是正常行为,所以请原谅我是瞎子哈哈。在将 MassTransit 与请求-响应结合使用时,我看到了一些奇怪的东西。

所以我在一个服务上有多个消费者,这些消费者侦听不同的请求来执行简单的任务,比如从数据库中获取数据。

为了测试每个消费者,我创建了一个控制台应用程序,为每个消费者执行请求并检查响应。

我注意到第一个请求-响应工作正常,但是当代码运行下一个检查时,收到了响应,但消息随后被移动到跳过的队列并被删除。

这是第二个请求的大众运输日志。

发送

<块引用>

[2021-05-14 10:27:11.812 DBG] (MassTransit.)-SEND rabbitmq://192.168.0.25/Ksrs.Requests:ConceptByConceptNoRequest d9360000-cf5b-480f-41911.6RequestByRequests.Concepts.Requests. /p>

接收

<块引用>

[2021年5月14日10:28:00.203 DBG(。MassTransit.ReceiveTransport) - RECEIVE的RabbitMQ://192.168.0.25/DESKTOP99KLG9M_Tests_bus_5r5yyygxmpry6jgtbdctpqurrb临时=真d9360000-cf5b-480F-2626-08d916ba7429 Ksrs.Response?。 ConceptResponse MassTransit.MessageHandler(00:00:00.0004546)

跳过?

<块引用>

[2021-05-14 10:28:41.361 DBG] (MassTransit.ReceiveTransport.)-SKIP rabbitmq://192.168.0.25/DESKTOP99KLG9M_Tests_bus_5r5yyygxmpry6jgtbdctary6trueb50c50dctary6trueb50dc-pqurb50dc-pqurb503-p50dc-pqurb50dc-pqurb03

不明白当我还是得到响应时跳过,响应符合预期,代码可以继续。

这是客户端请求和响应代码,对于我的所有检查,这几乎是相同的。唯一的区别是请求-响应类型。

static async Task<bool> GetByConceptNo(AutofacServiceProvider autoFac, short ksrsId, short conceptNo, ILogger logger)
    {
        var client = autoFac.GetService<IRequestClient<ConceptByConceptNoRequest>>();

        if (client is null) return false;

        Response<ConceptResponse> response;

        try
        {
            response = await client.GetResponse<ConceptResponse>(new ConceptByConceptNoRequest() {KsrsId = ksrsId, ConceptNo = conceptNo});

            logger.LogInformation("Received {Concept}.",response.Message.Concept);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return false;
        }
        return response.Message.Concept is not null;
    }

只是一些注意事项:

使用 Autofac 作为容器。

使用 Serilog 进行日志记录。

使用 RabbitMQ (3.8.16) 作为消息代理。

更新: 于是发现了一个有趣的东西。我向每个使用者添加了以下日志记录行,以便我知道正在运行。

Logger.LogInformation("Request for [what ever consumer running goes here]");

现在假设我有 Consumer1、Consumer2 和 Consumer3。我在日志中看到了这一点。

<块引用>

对消费者 1 的请求
发送等等等等
收到等等等等
请求消费者 1
请求消费者 2
发送等等等等
收到等等等等
请求消费者 1
请求消费者 3
发送等等等等
收到等等等等
发送等等等等
收到等等等等

所以似乎消费者 1 一直在执行,但我不明白为什么如果每个消费者的消息类型不同并且客户端没有调用它。

1 个答案:

答案 0 :(得分:2)

MassTransit 支持多态消息路由。因此,在上述情况下,如果消费者 1 使用的消息类型是通过为消费者 2 或消费者 3 生成的请求实现的,则消费者 1 将收到该消息的副本 - 它也会对此做出响应。

发布请求时(如果未指定特定目标地址,则这是默认设置),重要的是要确保为该消息类型配置了一个使用者。

多态消息传递非常适合事件,因为使用单个消费者和多个事件类型可以轻松提取有趣的事件属性。但是根据您在上面看到的内容,最好避免使用命令/请求。或者至少在上述情况下,在发布请求/命令时,使用消息的超类型的消费者不应响应,而可能仅跟踪/记录/审核命令/请求。

相关问题