RabbitMQ C#客户端:利用所有CPU内核

时间:2018-08-14 07:30:29

标签: c# .net-core rabbitmq

我正在使用.net core和rabbitMQ客户端进行测试。一个服务将发布大约一百万行数据,另一服务将接收并解析这些行。每行可能需要4到10秒的解析时间。 所以重点是

1)能够利用更多的机器来运行接收服务,并且

2)利用运行该服务的计算机的所有cpu内核。

所以1似乎很明显。使用更多服务器来解析来自队列的更多消息。但是我不知道该怎么做。

假设我想使用3个内核,我编写了一个简单的.net核心程序:

static async Task Main(string[] args)
        {
            var factory = new ConnectionFactory() { HostName = "localhost", DispatchConsumersAsync = true };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello1",
                                     durable: true,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);

                var tasks = new List<Task>() {
                    ReceiveEvent(channel, 1),
                    ReceiveEvent(channel, 2),
                    ReceiveEvent(channel, 3)
                };

                await Task.WhenAll(tasks);

                Console.WriteLine(" Press [enter] to exit.");
                Console.ReadLine();
                //
                channel.Close();
                connection.Close();
            }
        }

        private static async Task ReceiveEvent(IModel channel, int consumerNo)
        {            
            var consumer = new AsyncEventingBasicConsumer(channel);

            int i = 1;
            consumer.Received += async (model, ea) =>
            {
                var body = ea.Body;
                var message = Encoding.UTF8.GetString(body);
                Console.WriteLine($"Received {i++} lines in consumer {consumerNo} --- {message}");
                Thread.Sleep(500 * consumerNo);
                //
                channel.BasicAck(ea.DeliveryTag, false);
                await Task.Yield();
            };
            channel.BasicConsume(queue: "hello1",
                                 autoAck: false,
                                 consumer: consumer);
        }

无论我运行了多少次,只有1号消费者正在捕获事件。我是否需要在Task.WhenAll行上进行此类调用?还是如果事件被异步触发,.net核心运行时是否会利用所有cpu核心?

非常感谢

1 个答案:

答案 0 :(得分:0)

根据我对RabbitMQ的经验,当收到一条消息时,将创建一个消息列表线程。处理此消息时,队列不会将其他消息推送到列表器。就您而言,您必须先接收到消息,然后才能在多线程中进行处理。