【问题标题】:Google PubSub message duplicationGoogle PubSub 消息重复
【发布时间】:2018-05-20 06:28:12
【问题描述】:

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

【问题讨论】:

    标签: python google-cloud-pubsub


    【解决方案1】:

    一般而言,由于 Google Cloud Pub/Sub 提供至少一次交付,因此可能会发生重复。通常,这个比率应该非常低。 10%的比率会非常高。在这个特定的例子中,可能是客户端库中的一个问题导致了过多的重复,即fixed in April 2018

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 酷。还认为 Google 表示您可以多次收到同一消息:通常,Pub/Sub 会按照发布的顺序发送每条消息一次。但是,有时可能会乱序或多次传递消息。一般来说,容纳多次传递要求您的订阅者在处理消息时是幂等的 Subscriber docs
      【解决方案3】:

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

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

      另外请记住,如果您需要半小时以上的时间来处理一条消息,目前预计会出现一些重复。

      【讨论】:

      • 谢谢 Max,这可能是相关的(通常我会确认所有消息,但确认它们需要时间,因此库可能会将它们视为未确认。)我找不到可以控制的文档批量大小,或一次确认所有批次
      猜你喜欢
      • 2019-07-02
      • 2019-10-25
      • 2021-06-18
      • 1970-01-01
      • 2019-10-05
      • 2017-10-23
      • 2021-12-30
      • 2019-02-10
      • 2016-10-12
      相关资源
      最近更新 更多