回调未处理Google Cloud PubSub消息

时间:2018-09-05 14:20:13

标签: python google-cloud-platform google-cloud-pubsub

我正在尝试使用Google PubSub在两个服务之间传递和接收消息。但是,发送的某些消息似乎是随机丢弃的,并且订阅者的回调方法未对其进行处理。

发送消息时,大约一半的消息由回调方法处理。对于另一半,该回调方法似乎根本没有被调用(不记录任何信息)。但是,消息仍然从主题中消失,并且不会重新发送。

用于启动订户的代码:

logger = logging.getLogger(LOGGER_NAME)
logger.info('Starting the pubsub subscriber')
subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(GOOGLE_CLOUD_PROJECT, SUBSCRIPTION_NAME)
subscriber.subscribe(subscription_path, callback=callback)
while True:
    try:
        sleep(60)
    except Exception as e:
        // Log exception

回调方法:

def callback(message):
    logger = logging.getLogger(LOGGER_NAME)
    logger.info(f'Recieved callback with message: {message}', extra = {'callback_message': message}  )
    // Process message

该错误似乎在订户端。消息是从发布者发送的,如果订阅者未连接到主题,则消息不会消失。

我尝试使用流控制来控制订户检索到的消息数,但似乎没有任何作用。

是否可以在不调用回调方法的情况下处理消息?邮件可能会从该主题中消失的还有其他原因吗?

编辑: 证明另一服务正在读取相同的订阅,正在处理丢失的消息。

1 个答案:

答案 0 :(得分:0)

我知道您找到了解决问题的方法,但是我认为列出一些调试此类问题的有用步骤是值得的:

  1. 检查以确保消息实际上已发布。发布成功后,响应应包括消息的ID,例如,APIFuture在Java Publish方法中产生的字符串。
  2. 检查是否积压了邮件。您可以通过Stackdriver查看subscription/oldest_unacked_message_agesubscription/num_undelivered_messages
  3. 检查您的订户上是否设置了flow control,以阻止您及时接收所有消息。如果您设置了流控制并且阻止了所有消息的传递,则您可能会发现Stackdriver中未传递消息的数量正在增加。
  4. 确保您没有其他订阅相同订阅消息的客户端。例如,也许您正在使用gcloud tool to pull并查看消息。在这种情况下,您可能不会在Stackdriver中看到未送达消息的数量增加。

如果在检查完所有内容后仍不确定您的消息发生了什么,最好与支持人员联系,提供您的项目和订阅的名称以及您认为未发送的任何消息的ID。