我已在Windows Server 2012 64位上安装了RabbitMQ。我测试了发布和使用大量数据的部分,所有一切都很好,唯一的问题是在RabbitMQ服务器重新启动后队列中的消息会丢失。我正在使用RabbitMQ的VB.Net SDK。我将队列声明的“Durable”属性设置为true,并将DeliveryMode BasicQueueProperties设置为“2”以使消息持久化,但仍然会在服务器重新启动后丢失消息。我该如何解决这个问题?
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) -- 它可能只保存在缓存中而没有真正写入磁盘。持久性保证并不强大,但对于我们的简单任务队列已经足够。如果需要更强的保证,则可以使用发布者确认。
channel.QueueDeclare("queue", true, false, false, null);
,即将排他性和自动删除设置为false?如果是,请尝试使用Web控制台或rabbitmqctl检查您的队列属性。 - Nicolas Labrot