【发布时间】:2016-03-22 08:49:37
【问题描述】:
为了避免队列读取器进程崩溃时数据丢失,我们需要从 RabbitMQ 获取未确认的消息。对于每 1000 条消息,我们将消息数据提交到磁盘,然后这些消息可以标记为已确认和已使用。有没有办法让它们不被承认,然后专门针对我们刚刚得到的那些?例如,我们可以将它们添加到列表中,然后遍历该列表以查找消息吗? 这是在 RabbitMQ .net 仅供参考。
【问题讨论】:
标签: .net indexing queue rabbitmq
为了避免队列读取器进程崩溃时数据丢失,我们需要从 RabbitMQ 获取未确认的消息。对于每 1000 条消息,我们将消息数据提交到磁盘,然后这些消息可以标记为已确认和已使用。有没有办法让它们不被承认,然后专门针对我们刚刚得到的那些?例如,我们可以将它们添加到列表中,然后遍历该列表以查找消息吗? 这是在 RabbitMQ .net 仅供参考。
【问题讨论】:
标签: .net indexing queue rabbitmq
是的,您可以使用来自 RabbitMQ 的消息并明确确认您成功处理的消息。您可以在the second tutorial on RabbitMQ website 中找到完整的示例。但这里是本教程的相关部分:
设置消费者时,将noAck ("no manual ack") 设置为 false,因此 .NET 客户端库不会自动确认消息:
channel.BasicConsume(queue: "task_queue", noAck: false, consumer: consumer);
在您的消费者回调中,您明确地确认了一条消息:
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
您可以确认一条消息(multiple 为假),也可以确认所有消息(multiple 为真)。
你也可以"unacknowledge" messages,所以 RabbitMQ 可以重新排队,例如发送给另一个工人。与确认一样,您可以判断是否要取消确认一条或所有消息。此外,您可以将 requeue 标志设置为 true 或 false,以指示是否应重新排队或丢弃消息。
【讨论】:
basic.ack 方法是不可能的:它需要一个消息号和 multiple 标志,true 表示应该确认此消息号和所有以前的消息号。