Google Pub/Sub modifyAckDeadLine 重复

Google Pub/Sub modifyAckDeadLine duplicates

这里是个小问题,我们看到如果我们 NACK 消息 ( modifyAckDeadline(0) ),消息会重复并发送到队列的前面,这很好,但是我们是否还必须在之后确认该消息NACK?,我们问是因为我们在订阅指数退避中启用了 0-600 秒,并且我们看到一些消息有很多重复,即:10 分钟后 10 条消息堆叠到 200 条消息。所以我们认为原始消息一直保持到指数退避的最大重试次数乘以一条消息的 NACK 次数。

如果我们是对的,解决方案很简单 NACK -> 然后 ACK 原始消息或 ACK 然后 NACK

确认截止时间 = 600 秒

已启用订购键

当使用排序键时,如果您收到多条关于同一个排序键的消息并且没有确认第一条消息,那么所有已经收到的关于该排序键的消息都将被重新传送,即使您确认了它们。消息可以分批发送到客户端,因此,如果您拒绝其中一条消息,后续消息可能已经在客户端排队等候传递并传递给您的回调。但是,即使您确认了这些消息,它们也会被重新传送。

因此,例如,假设您有一个键“A”,消息 1、2 和 3 作为批次发送到客户端。您在回调中收到 1 并确认它,然后收到 2 并确认它,然后收到 3 并确认它。在消息 1 的退避期过去后,您将再次收到消息 1、2 和 3。每当重新传递消息时,您都应该确认重新传递(再次处理它或意识到您已经处理过它并且只确认它)。

这称为“一致的重新交付”属性,您可以在 Medium post about ordering keys 的“订购属性”部分阅读有关内容。