我有一个.NET项目,需要读取给定队列中的消息。 我有几个生产者将相同类型的消息写入队列。 我希望我的消费者应用程序具有多个线程来读取消息并进行处理,以使负载不会在单个线程上。
关于如何实现此目标的任何想法或示例代码? 再次注意: 每个消息应处理一次,而不要处理多次。在工作线程之间应该平衡工作
答案 0 :(得分:0)
您将需要一些管道来完成该任务。
我有一个名为Shuttle.Esb的开源服务总线,并且您可能希望考虑使用许多其他服务总线选项。
但是,如果您不想走那条路,您仍然可以查看一些代码和实现以获取一些想法。我有一个RabbitMQ实现可能会有所帮助。
答案 1 :(得分:0)
看看masstransit项目:http://masstransit-project.com/MassTransit/usage/message-consumers.html
它具有预取计数和并发限制之类的配置。它使您可以并行使用消息。
而且设置非常简单:
IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
IRabbitMqHost host = cfg.Host(new Uri(RabbitMQConstants.RabbitMQUri),
hst =>
{
hst.Username(RabbitMQConstants.RabbitMQUserName);
hst.Password(RabbitMQConstants.RabbitMQPassword);
});
cfg.ReceiveEndpoint(host,
RabbitMQConstants.YourQueueName,
endPointConfigurator => {
endPointConfigurator.Consumer<SomeConsumer>();
endPointConfigurator.UseConcurrencyLimit(4);
});
});
busControl.Start();
public class SomeConsumer :
IConsumer<YourMessageClass>
{
public async Task Consume(ConsumeContext<YourMessageClass> context)
{
await Console.Out.WriteLineAsync($"Message consumed: {context.Message.YourValue}");
}
}