【发布时间】:2017-04-27 17:34:09
【问题描述】:
假设我与 rabbit 建立了连接,并且我已经提取了 1000 条消息,但尚未确认它们,因为它们正在由 Blocking 集合中的单个线程处理。
现在假设我的连接中断并自动恢复。此时服务器上的所有这些消息都将重新排队等待传递。但是我在本地仍然有它们的副本,带有旧的交付标签。
这让我相信我应该通过清除本地队列来处理连接或通道关闭事件。
你能确认这是真的吗?
【问题讨论】:
假设我与 rabbit 建立了连接,并且我已经提取了 1000 条消息,但尚未确认它们,因为它们正在由 Blocking 集合中的单个线程处理。
现在假设我的连接中断并自动恢复。此时服务器上的所有这些消息都将重新排队等待传递。但是我在本地仍然有它们的副本,带有旧的交付标签。
这让我相信我应该通过清除本地队列来处理连接或通道关闭事件。
你能确认这是真的吗?
【问题讨论】:
是的,就是这样。这些消息将被重新传递。
因此,除了清除我们在本地排队的消息之外,您可能还需要考虑预取,以免本地排队的消息太多。
你的策略是拉 1000 个,处理它们,然后最后全部 ack 吗?我可以看到,由于性能原因,您可能会这样做,因此您可以发送一个带有 multiple=true 的 ack,但它确实会带来额外的重新交付和重复处理风险。
【讨论】:
您是对的。如果您一次处理一条消息,您可以将预取计数设置为 1,您也可能不需要在本地清除任何消息。
【讨论】: