因此,我有一个基于客户端-服务器的生态系统,我使用 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);
}
蒂亚
basicGet
很少是正确的解决方案。在步骤 2 中,客户端应该从 RabbitMQ 进行消费。无需通知消息已准备好。一旦消息进入队列,RabbitMQ 就会将其发送给客户端 B。步骤 3 和步骤 4 变得不必要了。