Python 谷歌发布延迟确认

Python 谷歌发布延迟确认,python,google-cloud-platform,google-kubernetes-engine,google-cloud-pubsub,Python,Google Cloud Platform,Google Kubernetes Engine,Google Cloud Pubsub,我在GKE上部署了一个应用程序,分别部署在不同的微服务中。 其中一个微服务,我们称之为“worker”,从pubsub消息接收要执行的任务 执行这些任务最多需要1小时。由于Google pubsub消息的常规确认截止日期很短,我们在截止日期前每隔10秒更新一次。下面是一段代码: def看门狗(businessDoneEvent、订阅、确认截止日期、消息、确认id): ''' 防止在计算停止时重新发布消息 跑步 ''' 尽管如此: #如果是defaultDeadline,则在续订之前等待(defa

我在GKE上部署了一个应用程序,分别部署在不同的微服务中。 其中一个微服务,我们称之为“worker”,从pubsub消息接收要执行的任务

执行这些任务最多需要1小时。由于Google pubsub消息的常规确认截止日期很短,我们在截止日期前每隔10秒更新一次。下面是一段代码:

def看门狗(businessDoneEvent、订阅、确认截止日期、消息、确认id):
'''
防止在计算停止时重新发布消息
跑步
'''
尽管如此:
#如果是defaultDeadline,则在续订之前等待(defaultDeadline-10)秒
#大于5秒;否则每秒钟更新一次
睡眠时间=确认截止时间-如果确认截止时间>10,则为10,否则为1
startTime=time.time()
while time.time()-startTime<睡眠时间:
info('sleep time:{}-ack_deadline:{}'。格式(time.time()-startTime,ack_deadline))
如果businessDoneEvent.isSet():
LOGGER.info('Business done!')
返回
时间。睡眠(1)
订阅方=订阅方客户端()
LOGGER.info('修改消息的确认截止日期'+
str(message.data)+“处理到”+
str(确认截止日期))
订户。修改确认截止日期(订阅,[ack\U id],
确认(截止日期)
执行结束后,我们将看到以下代码:

def callbackWrapper(回调,
订阅
消息
确认id,
终点,
上下文
用户,
PostAcknowledgementCallback=无):
'''
发布/订阅消息确认,如果一切正常运行
'''
尝试:
回调(message.data、端点、上下文、**message.attributes)
例外情况除外,如e:
LOGGER.info(message.data)
LOGGER.error(traceback.format_exc())
提高e
其他:
LOGGER.info(“正在尝试确认…”)
my_retry=retry(谓词=if_exception_type(ServiceUnavailable),deadline=3600)
subscriber.acknowledge(订阅,[ack\u id],retry=my\u retry)
LOGGER.info(str(ack_id)+“已确认”)
如果PostAcknowledgementCallback不是None:
PostAcknowledgementCallback(message.data,
**message.attributes)
请注意,我们在大多数微服务中也使用了这段代码,它工作得很好

我的问题是,即使我没有从这段代码中得到任何错误,并且确认请求似乎被正确发送,但它实际上在稍后被确认。例如,根据GCP控制台,现在我有8条未确认的消息,但我应该只有3条。它还说,当我一小时只有5个时,有12个:

我有一个使用pubsub公制的水平吊舱自动缩放器。完成吊舱后,它们不会缩小,或者只会在1小时或更长时间后缩小。这会产生一些我想避免的无用成本


有人知道为什么会发生这种情况吗?

您使用了错误的设计。首先,不要延迟确认消息,以便可以运行长作业。这是错误的做法。第二,更改您的设计,以使用诸如云任务之类的服务来管理和分发长时间运行的任务@约翰汉利同意了,但不幸的是,我发现它不是正确的设计,太迟了,我需要一个短期的解决方案,但我会在以后更改设计。云任务很容易实现,在某些方面与发布/订阅类似,这使得切换很容易。好的,谢谢,我来看看it@Silveris它应该能自动工作。当您收到消息对象时,直到您确认或nack它,客户端库将在后台自动续订确认截止日期。您可以通过取消手动更新来测试这一点。