RabbitMQ 数据在崩溃时丢失

Posted

技术标签:

【中文标题】RabbitMQ 数据在崩溃时丢失【英文标题】:RabbitMQ data lost on crash 【发布时间】:2021-01-13 02:58:36 【问题描述】:

我正在使用 RabbitMQ 来存储和检索数据。我提到了这个article。我已将 durable 标志设置为 true 并将 noAck 标志设置为 false(即使在消费后我也需要将消息存储在队列中)。

我创建了这些场景:

我在消费者关闭状态(非活动)的情况下更新了 3 次库存数据。然后我激活了消费者。它消耗了队列中的所有三个消息。 [效果很好。]

现在我再次产生了三个消息(消费者再次处于非活动状态),然后我关闭了 rabbitmq 服务器。当我重新启动服务器并激活消费者时。它似乎没有消耗数据(队列中的消息是否已丢失?)

消费者:

connection.createChannel(function (error1, channel) 
if (error1) 
  throw error1;

var queue = "updateStock2";

channel.assertQueue(queue, 
  durable: true,
);

console.log(
  " [*] Waiting for stockData messages in %s. To exit press CTRL+C",
  queue
);

channel.consume(
  queue,
  function (data) 
    stock = JSON.parse(data.content.toString());
    console.log(" [x] Received Stock:", stock.name + " : " + stock.value);
  ,
  
    noAck: false,
  
);

制片人:

  connection.createChannel(function (error1, channel) 
  if (error1) 
    throw error1;
  

  var queue = "updateStock2";

  channel.assertQueue(queue, 
    durable: true,
  );
  channel.sendToQueue(queue, Buffer.from(data));

  console.log(" [x] Sent %s", data);
);
setTimeout(function () 
  connection.close();
  //process.exit(0);
, 500););

他们不是很坚持吗?如果服务器崩溃,队列中的所有消息都将永远消失?

服务器崩溃时如何检索队列中的数据?

提前致谢。

【问题讨论】:

【参考方案1】:

为什么您的消息丢失了?

很遗憾,你发消息的时候没有声明persistent: true。检查https://www.rabbitmq.com/tutorials/tutorial-two-javascript.html,所以你应该使用channel.sendToQueue(queue, Buffer.from(msg), persistent: true);

他们不是很坚持吗?

持久队列将在节点启动时恢复,包括其中发布为持久的消息。发布为瞬态的消息将在恢复期间被丢弃,即使它们存储在持久队列中。

哪个中间件可能更适合您?

如果你想要一个即使被消费者消费也能持久保存消息的中间件,你可能需要kafka

【讨论】:

以上是关于RabbitMQ 数据在崩溃时丢失的主要内容,如果未能解决你的问题,请参考以下文章

五RabbitMQ持久化

RabbitMQ学习-- 队列持久化

RabbitMQ-持久化

[RabbitMQ]队列持久化

RabbitMQ持久化

RabbitMQ消息和队列的持久化