masstransit批量处理/消费消息

时间:2016-12-02 01:37:39

标签: rabbitmq masstransit

我对消费消息有清楚的了解:http://docs.masstransit-project.com/en/latest/usage/consumer.html

这些实现一次只能处理一条消息。

我需要一次批量处理多条消息。

3 个答案:

答案 0 :(得分:1)

事实证明,今天您可以执行此操作:

firstDictionary[reference] = new Dictionary<string,double>() { { name, quantity }};

答案 1 :(得分:0)

MassTransit目前没有批量消息消费。您可以尝试使用TPL和Reactive混合将消息读入批处理,但MassTransit的意图和设计是将批处理分解为可以单独处理的消息。

如果您需要批量处理,可能会像Event Hub或Kafka这样对您的目的更有意义。

答案 2 :(得分:0)

Mass Transit现在具有实验性功能,可以批量处理单个消息。

配置您的总线:

_massTransitBus = Bus.Factory.CreateUsingRabbitMq(
                cfg =>
                    {
                        var host = cfg.Host(new Uri("amqp://@localhost"),
                            cfg =>
                                {
                                    cfg.Username("");
                                    cfg.Password("");
                                });

                        cfg.ReceiveEndpoint(
                            host,
                            "queuename",
                            e =>
                                {
                                    e.PrefetchCount = 30;
                                    e.Batch<MySingularEvent>(
                                        ss =>
                                            {
                                                ss.MessageLimit = 30;
                                                ss.TimeLimit = TimeSpan.FromMilliseconds(1000);
                                                ss.Consumer(() => new BatchSingularEventConsumer());
                                            });
                                });
                    });

并创建您的消费者:

public class BatchSingularEventConsumer: IConsumer<Batch<MySingularEvent>>
{
    public Task Consume(ConsumeContext<Batch<MySingularEvent>> context)
    {           
         Console.WriteLine($"Number of messages consumed {context.Message.Length}");
         return Task.CompletedTask;
    }
}

您可以使用消息限制时间限制来配置批处理。

我建议阅读Chris Patterson关于Batch Message Consumption的问题,尤其是有关预取的部分

  

批处理大小必须小于或等于任何预取计数或并发消息传递限制,才能达到大小限制。如果其他限制导致无法达到批量大小,则永远不会调用消费者。