Rabbitmq AMQP basic.get从队列中提取并发使用者

Rabbitmq AMQP basic.get从队列中提取并发使用者,rabbitmq,message-queue,amqp,Rabbitmq,Message Queue,Amqp,当使用RabbitMQ作为消息代理时,我有一个场景,其中多个并发使用者使用basic.get AMQP方法从队列中提取消息,并使用显式确认从队列中删除消息。假设以下设置 Q有消息M1、M2、M3,并有消费者C1、C2和C3(每个消费者都有自己的连接和通道)连接到它 basic.get方法如何处理并发性?对basic.get方法的调用是否同步,以使用各自的连接和通道处理并发使用者?C1、C2和C3发出basic.get调用以同时接收消息(假设服务器同时接收所有3个请求) C1使用basic.get

当使用RabbitMQ作为消息代理时,我有一个场景,其中多个并发使用者使用basic.get AMQP方法从队列中提取消息,并使用显式确认从队列中删除消息。假设以下设置

Q有消息M1、M2、M3,并有消费者C1、C2和C3(每个消费者都有自己的连接和通道)连接到它

  • basic.get方法如何处理并发性?对basic.get方法的调用是否同步,以使用各自的连接和通道处理并发使用者?C1、C2和C3发出basic.get调用以同时接收消息(假设服务器同时接收所有3个请求)

  • C1使用basic.get和gets M1请求消息。当C2请求消息时,由于它使用不同的连接,它是否再次得到M1

  • 消费者如何按预定义的大小批量提取消息


  • 该场景不需要特殊配置。每个客户端将自动从队列中获取和接收一条消息,就像您希望的那样。

    您可能需要阅读和

    首先,避免在消费者中使用
    basicGet
    。而是使用消费者界面
    basicConsume
    。这允许RabbitMq在消息到达队列时推送消息。其他一切都是资源的腰围,因为它归结为繁忙的投票

    使用
    basicConsume
    RabbitMq甚至会在后台将更多消息推送到某个
    prefetch
    count。这允许您同时处理多条消息,并最大限度地减少等待下一条消息处理所需的时间(如果某些消息可用)

    并发性根本不是问题,这就是您使用队列的目的! 当一个队列上有多个使用者时,消息将始终仅传递给一个使用者(只要消息已确认)。否则,您需要为每个消费者使用专用队列,并相应地路由您的消息

    顺便说一句,如果你能够在你的消费者之间共享连接,你应该这样做。
    请确保每个线程使用一个通道。

    您的问题真正触及了排队和流程理论的核心,因此我将从这个角度进行回答(就我的回答而言,RabbitMQ确实是一个通用的消息代理,因为这适用于任何消息代理)

    basic.get方法如何处理并发性?是打电话给你的吗 basic.get方法同步以处理每个并发使用者 使用自己的连接和通道?C1、C2和C3发布一个basic.get 调用以同时接收消息(假定服务器接收到 所有3个请求同时进行)

    答案1:RabbitMQ旨在成为可靠的消息代理。它包含内部流程和控制,以确保同一消息不会多次传递给不同的使用者。现在,由于测试您描述的场景是不切实际的,所以它工作得完美吗?谁知道呢。这就是为什么使用基于消息的体系结构的正确设计的应用程序将使用幂等事务,这样,如果同一事务被多次处理,结果将与事务被处理一次相同。 外卖:设计应用程序,使此问题的答案不重要

    C1使用basic.get和gets M1请求消息。当指挥与控制系统请求时 对于一条消息,由于它使用不同的连接,它会得到M1吗 又来了

    答案2:否。根据我先前答案中的假设,RabbitMQ代理不会在同一消息交付后返回。根据通道和队列的设置,消息可能会在传递时自动确认,并且永远不会重新传递。其他设置将在处理线程/通道“死亡”或处理线程的否定确认时自动显示消息requeue。这是一项重要的功能,因为如果一条“有毒”消息可以提供给多个使用者,它可能会在应用程序中反复造成严重破坏外卖:在设计应用程序时,您可以放心地依赖此假设

    消费者如何按预定义的大小批量提取消息


    回答:他们不能,他们这样做也没有意义。在任何排队系统中,基本假设是项目在单个文件中从队列中删除。试图违反这一假设会导致不可预测的行为;此外,单件流通常是最有效的加工方法。然而,在现实世界中,有些情况下批量大小必须大于1。在这种情况下,将批加载到它自己的单个消息中是有意义的,因此这可能需要一个单独的处理线程,该线程从队列中提取消息并将它们批处理在一起,或者最初将它们批处理。请记住,一旦有多个使用者,就无法保证单个消息按顺序处理外卖:应尽可能避免批处理,但如果无法避免,您可能不会假设批处理将以任何特定顺序包含单个消息。

    不清楚您的问题是什么。第二点是否。其他几点我不理解!“同步处理并发消费者”是什么意思!RMQ是一种先进先出系统,所以你输入3条信息,C1得到第一条,C2得到第二条。。等假设您使用的是prefetch=1。我下面的答案有帮助吗?如果是,请将其标记为答案。如果没有,我如何详细说明?那么,RabbitMQ是否处理同步部分?它是否在basic.get请求上实现了一些锁定?重新表述我的