Google PubSub邮件重复

时间:2017-12-06 11:26:45

标签: python google-cloud-pubsub

我正在使用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()

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

当你收到这些重复的邮件时 - 你是否已经在重新传递邮件时已经收到了邮件,或者在你还在处理它时是这样?如果你已经确认,是否有一些消息你已经避免了?如果某些消息被激活,则可能会重复,但同一批次中的消息需要再次发送。

另请注意,如果您花费半小时处理邮件,目前预计会有一些重复。

答案 2 :(得分:0)

通常,如果Google Cloud Pub / Sub提供至少一次交付,则可能会重复。通常,此速率应非常低。 10%的比率会很高。在此特定情况下,客户端库中可能是一个问题,导致重复项过多,即fixed in April 2018

对于重复过多的一般情况,有几件事需要检查以确定问题是否出在用户端。有两个地方可能发生重复:在发布端(有两个不同的消息,每个消息传递一次)或在订阅端(有一个单个的消息传递多次)。区分情况的方法是查看消息随附的messageID。如果重复相同的ID,则复制位于订阅方。如果ID是唯一的,则复制在发布侧发生。在后一种情况下,应查看发布者,以查看是否出现导致发布重试的错误。

如果问题出在订户一方,则应检查以确保在确认截止日期之前已确认消息。在此时间内未确认的邮件将重新发送。如果这是问题所在,则解决方案是更快地确认消息(也许通过增加订阅的更多订户)或增加确认期限。对于Python客户端库,可以通过在传递给max_lease_duration方法的FlowControl对象中设置subscribe来设置确认截止日期。