【问题标题】:Locking in RabbitMQ queue to prevent race conditions锁定 RabbitMQ 队列以防止竞争条件
【发布时间】:2014-06-25 17:30:50
【问题描述】:

在使用 ack 时,是否有一种简单的方法来实现诸如“锁定”之类的东西来防止 RabbitMQ 队列中的竞争条件?

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

【问题讨论】:

  • 如果你是在ack-mode下消费,那么当消费者确认消息失败时,消息会被放回队列中。这是 RabbitMQ 的默认行为。你有什么不一样的经历吗?
  • 是的,但是如果您有一些处理工作要做,这可能由于某种原因而失败 - 比如说您需要一秒钟左右的时间来处理消息。如果在第一次收到消息时就确认消息,如果处理失败,则消息将永远不会被成功处理。如果您在完成处理后确认消息,您可能会冒另一个工作人员在您回复之前抓住并处理它的风险,并且该消息将被处理两次。
  • 是的。这就是为什么消费者应该尽可能地幂等的原因之一。
  • 如果你没有ack,rabbit不会发送给第二个消费者。可能会发生ack无法到达,然后在重新连接通道时再次发送消息。

标签: rabbitmq


【解决方案1】:

只需处理它,然后确认它。 如果处理失败,请使用acknack 重新排队消息。

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);

【讨论】:

  • 我担心这不会解决赛车状况,因为第二个消费者在同一条消息上重复相同的逻辑
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多