Multithreading RabbitMQ使用者中的并发消息处理

Multithreading RabbitMQ使用者中的并发消息处理,multithreading,azure,rabbitmq,Multithreading,Azure,Rabbitmq,我是RabbitMQ的新手,如果我的问题听起来很琐碎,请原谅。我想在RabbitMQ上发布消息,该消息将由RabbitMQ使用者处理 我的消费者机器是多核机器(最好是azure上的工作者角色)。但是QueueBasicConsumer一次推送一条消息。我如何编程以利用所有核心,在这些核心中我可以同时处理多条消息 一种解决方案是在多个线程中打开多个通道,然后在那个里处理消息。但是在这种情况下,我将如何决定线程的数量 另一种方法是在主线程上读取消息,然后创建任务并将消息传递给此任务。在这种情况下,我

我是RabbitMQ的新手,如果我的问题听起来很琐碎,请原谅。我想在RabbitMQ上发布消息,该消息将由RabbitMQ使用者处理

我的消费者机器是多核机器(最好是azure上的工作者角色)。但是QueueBasicConsumer一次推送一条消息。我如何编程以利用所有核心,在这些核心中我可以同时处理多条消息

  • 一种解决方案是在多个线程中打开多个通道,然后在那个里处理消息。但是在这种情况下,我将如何决定线程的数量
  • 另一种方法是在主线程上读取消息,然后创建任务并将消息传递给此任务。在这种情况下,我将不得不停止消费消息,以防有许多消息(在阈值之后)已经在进行中。不确定这是如何实现的

  • 提前感谢

    您的第二个选项听起来更合理-在单个频道上消费,并生成多个任务来处理消息。要实现并发控制,可以使用来控制正在运行的任务数。在启动任务之前,您将等待信号量变为可用,并且在任务完成后,它将向信号量发出信号,以允许其他任务运行

    您还没有指定可供选择的语言/技术堆栈,但无论您做什么,都要尝试使用线程池,而不是自己创建和管理线程。在.NET中,这意味着使用异步处理消息

    示例C#代码:

    您可能会发现在通道上启用显式ACK控制并使用设置未确认消息的最大数量比自己控制并发级别更容易。这样,您将永远不会一次收到超过所需数量的消息。

    此线程可能会有所帮助:
    using (var semaphore = new SemaphoreSlim(MaxMessages))
    {
        while (true)
        {
            var args = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
            semaphore.Wait();
            Task.Run(() => ProcessMessage(args))
                .ContinueWith(() => semaphore.Release());
        }
    }