【发布时间】:2015-12-30 15:36:32
【问题描述】:
处理使用 Rabbit 的 C# 项目。我在文档中发现了关于何时由于连接或通道死亡(是哪个?)而重新传递消息的相互矛盾的信息。
这里的文档: http://www.rabbitmq.com/semantics.html
声明当频道关闭时重新排队发送
可以使用 AMQP 方法将消息返回到队列 重新排队参数(basic.recover、basic.reject 和 basic.nack),或 由于通道关闭,同时持有未确认的消息。任何 这些场景导致消息在后台重新排队 早于 2.7.0 的 RabbitMQ 版本的队列。从 RabbitMQ 发布 在 2.7.0 中,消息始终按发布顺序保留在队列中,即使存在重新排队或通道关闭。
但是在这里:http://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html
状态:仅当工作连接终止时
如果消费者没有发送确认就死了,RabbitMQ 会理解 消息未完全处理并将重新发送给另一个 消费者。这样您就可以确保不会丢失任何消息,即使 工人偶尔会死。
没有任何消息超时; RabbitMQ 将重新传递消息 仅当工作人员连接中断时。即使处理一个也没关系 消息需要非常非常长的时间。
那么实际上什么时候重新交付?当工人或渠道死亡?我可以在一个频道上消费而在另一个频道上ACK吗?
目前我创建了一个 ChannelManager 类,它打开 N 个通道并将它们存储在 ConcurrentQueue 和 Queues / Dequeues Channels 中,并确保我们永远不会低于“最小”可用通道数。使用这种方法,我无法确保 Consume 和 Ack 发生在同一个频道上......
【问题讨论】:
-
关于第二个问题:“我可以在一个通道上消费但在另一个通道上进行 ACK 吗?” -> 不,你不能。