我们正在使用google-cloud-pubsub(0.24.0-beta)拉客户端来阅读来自订阅者的消息,并看到其中的高重复率。谷歌文档说,预计会有少量重复,但在我们的案例中,我们看到80%的消息即使在确认后也会重复。
最奇怪的部分是,即使我们使用consumer.ack()立即在接收方中确认消息,仍然会发生重复。 有人知道如何处理这个。
答案 0 :(得分:0)
大量的消息重复可能是flow control settings设置得太高或太低的结果。如果您的流量控制设置太高,您允许同时为客户端提供过多消息,那么可能是设置得太晚了。如果这是原因,您可能会看到机器的CPU处于或接近100%。在这种情况下,请尝试将未完成的消息或字节的最大数量设置为较小的数字。
也可能是流量控制设置设置得太低。有些消息在传递到MessageReceiver之前会在客户端缓冲,特别是如果您是流控制的。在这种情况下,消息可能会在交付之前在客户端中花费太多时间。此状态的邮件存在问题,正在an outstanding PR中修复。在这种情况下,您可以增加最大未完成字节数或消息数(最多可达到您的订阅者实际可以处理的内容),也可以尝试将setAckExpirationPadding设置为大于默认值500ms的值。
还值得检查您的发布商,看看它是否意外地多次发布消息。如果是这种情况,您可能会看到邮件的内容相同,但它们不会重复由Google Cloud Pub / Sub本身生成的邮件。
编辑提及客户端库中的错误:
如果您在v0.22.0和v0.29.0之间使用google-cloud-pubsub版本,则可能遇到了以下问题:获取邮件的基础机制可能会发生变化result in excessive duplicates。此问题已得到解决。