Google cloud pubsub 在PubSub订阅确认截止日期和重新交付的上下文中,对订阅者未完成的消息的含义是什么?

Google cloud pubsub 在PubSub订阅确认截止日期和重新交付的上下文中,对订阅者未完成的消息的含义是什么?,google-cloud-pubsub,Google Cloud Pubsub,我们正在以一种“尖头”的方式使用Google PubSub,在短时间(~10分钟)内发布数百万条小消息(

我们正在以一种“尖头”的方式使用Google PubSub,在短时间(~10分钟)内发布数百万条小消息(<10k),启动2k个GKE pod,每个pod有10个工作线程,每个线程使用同步拉取和确认PubSub服务调用,通过相关订阅工作(有10分钟的确认期限)。 订阅待办事项的堆栈驱动程序图将在大约30分钟内显示1000万条消息的峰值,然后向下倾斜到0(见下文)。
我们注意到,在特定的时间内,随着这些积压的数量从100万增加到1000万,从1%以下增加到10%以上,邮件的重新传递也有所增加

来自GAE任务拉动队列世界,我们假设工作人员将通过从PubSub订阅中拉动消息来“租用”消息,从拉动时开始,工作人员将有10分钟的时间确认消息。 然而,在添加日志记录(参见下面重新发布消息的示例)之后,似乎发生的情况是,重要的不是从拉取到确认的时间,而是从发布消息到确认的时间

这是对PubSub确认截止日期和随后的重新交付行为的正确理解吗

如果是这样的话,我们是否应该确保订阅的消息积压只会增长到工作线程能够在为订阅的确认截止日期配置的时间内处理和确认的大小,以使重新传递率平均<0.1%? 我们可能会让发布者根据订阅待办事项的大小施加某种背压,尽管GAE Pull任务队列租用行为似乎更直观

此外,在“Pull subscription”下的中的措辞:“订阅应用程序显式调用Pull方法,该方法请求传递消息”似乎暗示确认超时在客户端Pull调用返回给定消息后开始

注意:我们使用Python PubSub API(google cloud PubSub),尽管不是默认的流行为,因为这导致了PubSub文档中描述的“消息囤积”,因为我们发布了大量的小消息。相反,我们调用subscriber_client.pull和acknowledge(这似乎是PubSub服务API调用的薄型包装)


确认截止日期是指云发布/订阅向订户发送消息和接收该消息的确认呼叫之间的时间。(这不是发布消息和确认消息之间的时间。)对于原始同步请求和确认呼叫,订阅者负责管理租约。这意味着,如果不显式调用,则必须在确认截止日期(默认为,而不是10分钟)之前确认消息

如果使用其中一个云发布/订阅客户端库,收到的消息将自动延长其租约。此租约管理的工作方式取决于库。例如,在Python客户机库中,租约是根据以前消息的确认时间来扩展的

消息重新传递有很多原因。随着积压工作的增加,工作人员的负载可能会增加,从而增加工作人员的排队时间和确认消息所需的时间。您可以尝试增加员工数量,看看这是否可以提高大量积压的重新交付率。此外,邮件被确认的时间越长,它们被重新传递的可能性就越大。服务器可能会失去对它们的跟踪,并再次交付它们

在发布端,您可以做一件事来减少消息的重新传递—减少发布批量大小。在内部,ack状态按批次存储。因此,如果一批邮件中有一封邮件超过了最后期限,它们都可能被重新发送


消息重新传递的发生可能有许多其他原因,但扩展您的工作人员可能是一个很好的开始。您还可以尝试减少发布批量大小。

确认截止时间是指云发布/订阅向订户发送消息和接收该消息的确认呼叫之间的时间。(这不是发布消息和确认消息之间的时间。)对于原始同步请求和确认呼叫,订阅者负责管理租约。这意味着,如果不显式调用,则必须在确认截止日期(默认为,而不是10分钟)之前确认消息

如果使用其中一个云发布/订阅客户端库,收到的消息将自动延长其租约。此租约管理的工作方式取决于库。例如,在Python客户机库中,租约是根据以前消息的确认时间来扩展的

消息重新传递有很多原因。随着积压工作的增加,工作人员的负载可能会增加,从而增加工作人员的排队时间和确认消息所需的时间。您可以尝试增加员工数量,看看这是否可以提高大量积压的重新交付率。此外,邮件被确认的时间越长,它们被重新传递的可能性就越大。服务器可能会失去对它们的跟踪,并再次交付它们

在发布端,您可以做一件事来减少消息的重新传递—减少发布批量大小。在内部,ack状态按批次存储。因此,如果一批邮件中有一封邮件超过了最后期限,它们都可能被重新发送


消息重新传递的发生可能有许多其他原因,但扩展您的工作人员可能是一个很好的开始。您也可以尝试减少发布批量。

感谢您澄清Prad。听起来,只要工作人员在配置的ack截止日期内提取/ack消息,就可以建立数百万订阅积压(如图所示)。我们将订阅确认截止时间设置为10分钟,并添加了统计数据以跟踪订阅
PullMessage.ack: 1303776574755856 delay from lease: 0:00:35.032463 (35.032463 seconds), publish: 0:10:02.806571 (602.806571 seconds)