两个消费者使用基于 Pull 的方式检索消息时能否获得相同的消息集?

问题描述 投票:0回答:1

因此,我有一个基于客户端-服务器的生态系统,我使用 RabbitMQ 作为持久中间件。

现在一条消息的流程是这样的。

  • Step-1:客户端A向服务器发送一条消息,其中包含目的地 在该消息的元数据中设置为客户端 B。
  • Step-2:服务器收到消息后将消息推送到 RabbitMQ 并向客户端 B 发送他有一些消息的通知 来取。
  • Step-3:客户端 B 收到通知后调用获取消息 API 从服务器获取消息。
  • Step-4:在服务器上,从客户端 B 调用后拉取 使用基于拉取的方法从 RabbitMQ 发送消息 (
    channel.basicGet(queueName, false)
    )并递出名单 消息。

在上面的流程中,我有一些疑问。

首先,如果我的客户端收到两个通知,调用拉取消息API两次,可能会出现并发问题。

假设我在获取消息时没有发送消息Acknowledgment,而是在之后发送,那么是否有可能将同一条消息发送到两个pull API?如果是的话有什么办法可以防止这种情况发生吗?

从 MQ 获取消息的示例代码:

    long currentMessageCount = channel.messageCount(QUEUE_NAME);
    while (currentMessageCount-- > 0) {
        GetResponse getResponse = channel.basicGet(QUEUE_NAME, false);
        if (getResponse == null) {
            break;
        }
        AMQP.BasicProperties props        = getResponse.getProps();
        Envelope             envelope     = getResponse.getEnvelope();
        int                  messageCount = getResponse.getMessageCount();
        byte[]               body         = getResponse.getBody();
        /*
            Do some logic
         */
        channel.basicAck(envelope.getDeliveryTag(), false);
    }

蒂亚

java rabbitmq messaging
1个回答
0
投票

basicGet
很少是正确的解决方案。在步骤 2 中,客户端应该从 RabbitMQ 进行消费。无需通知消息已准备好。一旦消息进入队列,RabbitMQ 就会将其发送给客户端 B。步骤 3 和步骤 4 变得不必要了。

© www.soinside.com 2019 - 2024. All rights reserved.