我可以在群发传输中的端点配置中使用UsePartitioner来分区传递到同一队列的多种消息类型

时间:2017-03-21 15:59:23

标签: rabbitmq masstransit

我正在使用masstransit和rabbitmq。我的队列传递了各种类型的消息。大多数这些类型实现了IHaveOrganisationKey。我想在管道中添加一个分区器,以确保只有一个具有给定organisationkey的消息(任何类型)同时处理。目标是限制同时处理同一组织的多个消息时发生的并发问题,同时允许并行处理来自不同组织的消息。

配置代码

sbc.ReceiveEndpoint(host, this.queueConfiguration.QueueName, ep =>
{
    ep.PrefetchCount = this.busConfiguration.PrefetchCount;
    this.queueConfiguration.ConfigureEndpoint(ep);
    this.queueConfiguration.SubscribeMessages(worker, ep);
});

在QueueConfiguration中:

public override void ConfigureEndpoint(IRabbitMqReceiveEndpointConfigurator ep)
{
    // This is incomplete. Am I on the right track here?
    ep.UsePartitioner(1, x => x.TryGetMessage<IHaveOrganisationKey>());
}

1 个答案:

答案 0 :(得分:2)

在这种情况下,您需要单独创建分区程序,然后将其传递给每个消息类型配置。

var p = ep.CreatePartitioner(8);

ep.Consumer<ConsumerA>(x => x.Message<A>(m => m.UsePartitioner(p, c => c.Message.OrgKey)));
ep.Consumer<ConsumerB>(x => x.Message<B>(m => m.UsePartitioner(p, c => c.Message.OrgKey)));

如果您的消费者有多种消息类型,您可以在配置中指定多个Message语句。