我正在使用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()
答案 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
来设置确认截止日期。