锁定RabbitMQ队列以防止竞争条件

锁定RabbitMQ队列以防止竞争条件,rabbitmq,Rabbitmq,在使用ack时,是否有一种简单的方法来实现类似“锁定”的功能,以防止RabbitMQ队列中出现争用情况 我有以下问题-我有几个客户端使用ack使用队列。每当客户收到消息时,他都会确认并处理它。但是,如果由于某种原因处理失败,我希望消息返回到队列。只需处理它,然后确认它。 如果处理失败,则使用ack或nack重新查询消息 QueueingConsumer consumer = new QueueingConsumer(channel); boolean autoAck = false; chann

在使用ack时,是否有一种简单的方法来实现类似“锁定”的功能,以防止RabbitMQ队列中出现争用情况


我有以下问题-我有几个客户端使用ack使用队列。每当客户收到消息时,他都会确认并处理它。但是,如果由于某种原因处理失败,我希望消息返回到队列。

只需处理它,然后确认它。 如果处理失败,则使用
ack
nack
重新查询消息

QueueingConsumer consumer = new QueueingConsumer(channel);
boolean autoAck = false;
channel.basicConsume("hello", autoAck, consumer);


QueueingConsumer.Delivery delivery = consumer.nextDelivery();
//do your processing    
boolean requeue = false;
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), requeue);

如果您在确认模式下消费,则当消费者未能确认消息时,消息将被放回队列。这是RabbitMQ的默认行为。你是否经历了一些不同的事情?是的,但是如果你有一些处理工作要做,可能会因为某种原因而失败-比如说你需要一秒钟左右的时间来处理消息。如果在第一次收到消息时确认消息,如果处理失败,消息将永远不会成功处理。如果您在完成处理后确认邮件,则可能会有另一名工作人员在您确认之前抓取并处理邮件,邮件将被处理两次。是。这就是为什么消费者在任何可能的情况下都应该是幂等的原因之一,rabbit不会将其发送给第二个消费者。可能发生的情况是,ack无法到达,然后在通道重新连接时,消息会再次发送。我担心这不会解决竞速情况,因为第二个消费者在同一条消息上重复相同的逻辑