繁体   English   中英

Google PubSub 消息重复

[英]Google PubSub message duplication

我正在使用 python 客户端(作为 google-cloud 0.30.0 的一部分提供)来处理消息。 有时(大约 10%)我的消息被重复。 我将在几个小时内一次又一次地收到多达 50 次相同的消息。 我的订阅设置是 600 秒确认时间,但消息可能会在其前身一分钟后重新发送。

运行时,我偶尔会收到 503 错误(我用我的 policy_class 记录)有人遇到过这种行为吗? 有任何想法吗?

我的代码看起来像

c = pubsub_v1.SubscriberClient(policy_class)    
subscription = c.subscribe(c.subscription_path(my_proj ,my_topic)
res = subscription.open(callback=callback_func)
res.result()

def callback_func(msg)
  try:
     log.info('got %s', msg.data )
     ...
  finally:
     ms.ack()

您正在使用的客户端库使用一个名为 StreamingPull 的新 Pub/Sub API 进行订阅。 这样做的一个影响是不再使用您设置的订阅截止日期,而是由客户端库计算的截止日期。 客户端库还会自动为您延长消息的截止日期。

当你收到这些重复的消息时——你是否已经在重新发送消息时确认了消息,或者是在你仍在处理它的时候? 如果您已经确认,是否有一些消息是您避免确认的? 有些消息如果被确认可能会重复,但同一批次的消息需要再次发送。

另请记住,如果您处理一条消息的时间超过半小时,目前预计会有一些重复。

这似乎是 google-cloud-pubsub python 客户端的问题,我升级到版本 0.29.4 并且 ack() 按预期工作

一般来说,鉴于 Google Cloud Pub/Sub 提供至少一次交付,可能会发生重复。 通常,这个比率应该非常低。 10%的利率会非常高。 在这种特殊情况下,可能是客户端库中的一个问题导致了过多的重复,该问题已于2018 年 4 月修复

对于重复过多的一般情况,需要检查一些事项以确定问题是否出在用户端。 有两个地方可能会发生重复:在发布端(有两条不同的消息,每条消息都传递一次)或在订阅端(其中有一条消息传递多次)。 区分大小写的方法是查看随消息提供的 messageID。 如果相同的 ID 重复,则重复发生在订阅端。 如果 ID 是唯一的,则重复发生在发布端。 在后一种情况下,应该查看发布者,看它是否出现导致重试发布的错误。

如果问题出在订户端,则应检查以确保消息在确认截止日期之前得到确认。 在此时间内未确认的消息将被重新传送。 如果这是问题所在,那么解决方案是要么更快地确认消息(可能通过扩大订阅的订阅者数量),要么增加确认截止日期。 对于 Python 客户端库,通过在传递给subscribe方法的FlowControl object 中设置max_lease_duration来设置确认截止日期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM