重启后清空RabbitMQ队列

8
我已在Windows Server 2012 64位上安装了RabbitMQ。我测试了发布和使用大量数据的部分,所有一切都很好,唯一的问题是在RabbitMQ服务器重新启动后队列中的消息会丢失。我正在使用RabbitMQ的VB.Net SDK。我将队列声明的“Durable”属性设置为true,并将DeliveryMode BasicQueueProperties设置为“2”以使消息持久化,但仍然会在服务器重新启动后丢失消息。我该如何解决这个问题?

你是否在声明队列时使用了 channel.QueueDeclare("queue", true, false, false, null);,即将排他性和自动删除设置为false?如果是,请尝试使用Web控制台或rabbitmqctl检查您的队列属性。 - Nicolas Labrot
1个回答

11

https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html

这个 RabbitMQ 页面中关于 消息持久化 的说明非常清晰:

现在,我们确信即使 RabbitMQ 重新启动,任务队列也不会丢失。接下来,我们需要将消息标记为持久化的——通过将 IBasicProperties.Persistent 设置为 true。

var properties = channel.CreateBasicProperties();
properties.Persistent = true;
关于消息持久化的说明

将消息标记为持久化不能完全保证消息不会丢失。尽管它告诉RabbitMQ将消息保存到磁盘中,但仍存在一个短时间窗口,即当RabbitMQ接受消息但尚未保存时。此外,RabbitMQ并不为每条消息执行fsync(2) -- 它可能只保存在缓存中而没有真正写入磁盘。持久性保证并不强大,但对于我们的简单任务队列已经足够。如果需要更强的保证,则可以使用发布者确认。


感谢与我们分享这个。+1 - OO7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接