在 PubSub 订阅确认截止日期和重新传递的上下文中,未发送给订阅者的消息是啥意思?

     2023-02-16     211

关键词:

【中文标题】在 PubSub 订阅确认截止日期和重新传递的上下文中,未发送给订阅者的消息是啥意思?【英文标题】:What is the meaning of messages outstanding to a subscriber in the context of PubSub subscription acknowledge deadlines and re-delivery?在 PubSub 订阅确认截止日期和重新传递的上下文中,未发送给订阅者的消息是什么意思? 【发布时间】:2020-10-18 01:20:47 【问题描述】:

我们以“尖峰”方式使用 Google PubSub,我们在短时间内(约 10 分钟)发布数百万条小消息( 我们注意到,随着这些积压工作的大小从 100 万增加到 1000 万,在某些小时内从低于 1% 到超过 10%,我们注意到重新传递的消息有所增加。

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

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

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

此外,https://cloud.google.com/pubsub/docs/subscriber#push-subscription 中的“Pull subscription”下的措辞:“订阅应用程序显式调用 pull 方法,它请求传递消息”似乎暗示确认超时在客户端 pull 调用返回给定的留言?

注意:我们使用 Python PubSub API (google-cloud-pubsub),但不是默认的流式传输行为,因为这会导致 PubSub 文档中描述的“消息囤积”,因为我们发布了大量的小消息。相反,我们调用subscriber_client.pull 并确认(这似乎是围绕PubSub 服务API 调用的薄包装)

PullMessage.ack: 1303776574755856 delay from lease: 0:00:35.032463 (35.032463 seconds), publish: 0:10:02.806571 (602.806571 seconds)

【问题讨论】:

【参考方案1】:

确认截止日期是从 Cloud Pub/Sub 向订阅者发送消息到收到对该消息的确认调用之间的时间。 (这不是发布消息和确认消息之间的时间。)通过原始同步拉取和确认调用,订阅者负责管理租约。这意味着如果没有显式调用modifyAckDeadline,则必须在确认截止日期(默认为10 seconds,而不是10 分钟)之前确认消息。

如果您使用 Cloud Pub/Sub 客户端库之一,收到的消息将自动延长其租期。此租约管理工作方式的行为取决于库。例如,在 Python 客户端库中,租约会根据先前消息的确认时间进行扩展。

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

您可以在发布方面做一件事来减少消息重新传递 - 减少您的发布批量大小。在内部,确认状态是按批次存储的。因此,即使批次中的一条消息超过了 ackDeadline,它们都可能会被重新发送。

消息重新传递可能由于许多其他原因而发生,但扩展您的工作人员可能是一个不错的起点。您也可以尝试减少发布批量大小。

【讨论】:

感谢普拉德澄清。听起来应该可以建立数百万订阅积压(如图所示),只要工作人员在配置的确认期限内拉/确认消息。我们将订阅确认截止日期设置为 10 分钟,并添加了统计信息来跟踪我们提取一组消息和调用确认 PubSub API 之间的时间,似乎我们保持在 10 分钟阈值以下。我们会使用高达 10MB 的负载对发布 API 调用进行批处理,因此我们将调查这些调用的大小并寻找减少这些批处理的方法。 是的,建立大量积压应该没问题。更长的确认截止日期和消息量的组合可能意味着更多的重新传递,这只是因为我们必须保留多少状态。由于各种内部原因,其中一些可能会被丢弃,从而导致重新交付。为了澄清,“发布批量大小的大小”是指消息的数量,而不是字节。如果您的消息只有 5 KB,那么每 10 MB 批次发布的消息要比 1 MB 多得多。

PubSub 确认截止日期

】PubSub确认截止日期【英文标题】:PubSubacknowledgedeadline【发布时间】:2021-09-1411:14:03【问题描述】:我有一个云功能,它向PubSub发布消息并触发云运行以执行存档文件过程。当有大文件时,我的云运行python代码需要一些时间来... 查看详情

推送订阅发送多条消息远早于消息确认截止日期

...发布时间】:2019-06-2311:05:21【问题描述】:我为GCS设置了Pubsub通知。(https://cloud.google.com/storage/docs/pubsub-notifications)我将P 查看详情

Google Cloud PubSub 不确认消息

】GoogleCloudPubSub不确认消息【英文标题】:GoogleCloudPubSubnotackmessages【发布时间】:2019-07-0223:38:09【问题描述】:我们有基于GCPPubSub的发布者和订阅者系统。订阅者处理单个消息的时间很长,大约1分钟。我们已经将订阅者确认截... 查看详情

PubSub 不确认消息

】PubSub不确认消息【英文标题】:PubSubisn\'tacknowledgingmessages【发布时间】:2020-08-0801:08:00【问题描述】:我有一个pubsub订阅(除了go-routines的数量之外的所有默认设置都是1000),并且由于某种原因,消息永远不会得到确认,因此... 查看详情

PubSub 最大传递尝试次数和死信主题

】PubSub最大传递尝试次数和死信主题【英文标题】:PubSubMaximumdeliveryattempts&Deadlettertopic【发布时间】:2021-07-2420:18:45【问题描述】:5月1日快乐,我正在做一个简单的POC来利用PusSub的死信主题功能。我将订阅配置为在20次最大... 查看详情

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期

】如何修改后台CloudFunction的GoogleCloudPub/Sub订阅确认截止日期【英文标题】:HowtomodifyGoogleCloudPub/SubsubscriptionacknowledgementdeadlineforbackgroundCloudFunction【发布时间】:2019-07-2707:54:42【问题描述】:通过以下方式为CloudPub/Sub部署后台Cloud... 查看详情

pubsub 流式处理 pull nack 与无确认行为

】pubsub流式处理pullnack与无确认行为【英文标题】:pubsubstreamingpullnackvsnoacknowledgebehaviour【发布时间】:2019-12-0117:33:45【问题描述】:nack()有以下行为nack()"""拒绝确认给定的消息。这将导致消息被重新传递给订阅。现在在流式拉... 查看详情

Google Pubsub - 接收推送订阅的传递尝试

】GooglePubsub-接收推送订阅的传递尝试【英文标题】:GooglePubsub-Receivedeliveryattemptforpushsubscription【发布时间】:2021-06-0120:57:17【问题描述】:我有一个由Pubsub推送订阅触发的Google云功能。我想知道给定消息的当前传递尝试。在请... 查看详情

[已解决]Pubsub 推送订阅不确认消息

】[已解决]Pubsub推送订阅不确认消息【英文标题】:Pubsubpushsubscriptionnotacknowledgingmessages【发布时间】:2021-03-0502:55:27【问题描述】:这是我的设置。订阅A是一种推送订阅,可将消息发布到云运行部署。该部署公开了一个HTTP端点... 查看详情

pubsub-js库实现“跨组件”数据传递(代码片段)

...则发布匹配公共订阅和个性化订阅规则类似应用一、参考pubsub-jsnpm地址应用场景描述在React和Vue开发中,如果遇到同级组件或者跨多级组件的数据传递,可以使用pubsub-js库实现“订阅和发布”的能力,实现“数据跨组... 查看详情

pubsub-js库实现“跨组件”数据传递(代码片段)

...则发布匹配公共订阅和个性化订阅规则类似应用一、参考pubsub-jsnpm地址应用场景描述在React和Vue开发中,如果遇到同级组件或者跨多级组件的数据传递,可以使用pubsub-js库实现“订阅和发布”的能力,实现“数据跨组... 查看详情

GCP 中的确认截止日期、消息保留时间、死信和重试策略

】GCP中的确认截止日期、消息保留时间、死信和重试策略【英文标题】:AckDeadline,MessageRetentionDuration,DeadLetteringandRetryPolicyinGCP【发布时间】:2021-10-1621:25:50【问题描述】:我有几个与GCP中的上述主题相关的问题。如果有人可以详... 查看详情

发布/订阅推送返回 503 用于基本缩放

】发布/订阅推送返回503用于基本缩放【英文标题】:Pub/Subpushreturn503forbasicscaling【发布时间】:2020-01-2011:32:06【问题描述】:我正在使用Pub/Sub推送订阅,确认截止日期设置为10分钟,push端点使用basic缩放托管在AppEngine中。在我的... 查看详情

如何在 Firebase Cloud Functions 中确认 PubSub 消息?

】如何在FirebaseCloudFunctions中确认PubSub消息?【英文标题】:HowcanyouacknowledgeaPubSubmessageinFirebaseCloudFunctions?【发布时间】:2020-05-0502:13:05【问题描述】:我想知道确认PubSub消息(来自推送订阅者)的正确方法是什么,这是一个Fireba... 查看详情

Google pubsub 死字在 golang 中不起作用

】Googlepubsub死字在golang中不起作用【英文标题】:Googlepubsubdeadletteringnotworksingolang【发布时间】:2020-08-2410:42:21【问题描述】:我尝试使用googlepubsub死字。我使用控制台云为1个订阅启用死信。我已经将死信主题和maxAttemptDelivery属... 查看详情

Pubsub Java 订阅者在闲置一天后停止接收

】PubsubJava订阅者在闲置一天后停止接收【英文标题】:PubsubJavasubscriberstoppedreceivingafteradayofidling【发布时间】:2020-02-2401:18:49【问题描述】:我有一个java代码使用一个执行程序提供程序启动一个PubsubSubscriber。它可以空转16小时... 查看详情

为啥 PubSub 订阅在保留期到期后向死信主题发布消息

】为啥PubSub订阅在保留期到期后向死信主题发布消息【英文标题】:WhyPubSubsubscriptionpublishamessagetodeadlettertopicafterretentionperiodexpires为什么PubSub订阅在保留期到期后向死信主题发布消息【发布时间】:2020-12-1409:10:09【问题描述】:... 查看详情

PubSub Lite:确认当前积压的所有消息

】PubSubLite:确认当前积压的所有消息【英文标题】:PubSubLite:Acknowledgeallmessagescurrentlyinbacklog【发布时间】:2021-12-1913:12:12【问题描述】:如何确认当前积压在GooglePubSubLite订阅中的所有消息。我尝试使用gcloudpubsublite-subscriptionsack-... 查看详情