MassTransit 使用队列中的所有消息

Posted

技术标签:

【中文标题】MassTransit 使用队列中的所有消息【英文标题】:MassTransit consume all messages from the queue 【发布时间】:2021-12-09 16:20:18 【问题描述】:

我使用 Masstransit RabbitMQ。作为消费者,仅在事件在队列中发布时才消费事件。在上面的示例中,如何通过单个请求(使用)从队列中获取所有 SubmitOrder 列表?

var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
            
                cfg.ReceiveEndpoint("order-service", e =>
                
                    //here i want to get all SubmitOrder as list
                    e.Handler<SubmitOrder>(async context =>
                    
                        await Console.Out.WriteLineAsync($"Submit Order Received: context.Message.OrderId");
                    );
                );
            );

在工作中,我需要从队列中检索所有消息,然后使用该列表来处理它们。 我有一个在队列中发布消息的网关,然后我有一个从队列接收消息并处理它们的作业。

【问题讨论】:

【参考方案1】:

这通常不是消息传递的工作方式。使用 MassTransit,您可以单独传递消息,从而以原子方式使用每条消息。或者您可以使用batch consumer 一次发送多条消息。

认为您可以从队列中“获取所有消息”是不应该的,因为队列中可能有数百万条消息。而且您绝对不会将多个SubmitOrder 样式消息作为一个批次处理。从架构上讲,这只是一个非常糟糕的主意。

【讨论】:

我完全同意你的看法。由于存在队列结构,因此不建议从中弹出所有数据。批量消费者正是我所需要的。谢谢

以上是关于MassTransit 使用队列中的所有消息的主要内容,如果未能解决你的问题,请参考以下文章

MassTransit 确保在发布消息之前创建队列

在与 Entity Framework 的事务中通过 MassTransit 发送消息

是否可以使用 MassTransit 为 RabbitMQ 队列注册多个消费者?

使用交换和使用 MassTransit 的路由密钥发布消息

如何托管MassTransit和RabbitMq

配置连接时如何将 x-max-length 和 x-overflow 添加到 MassTransit 队列?