在 Google Cloud Pub/Sub 中处理订阅过滤器更改的最佳方式是啥?

Posted

技术标签:

【中文标题】在 Google Cloud Pub/Sub 中处理订阅过滤器更改的最佳方式是啥?【英文标题】:What is the best way to handle changes to the filter on a subscription in Google Cloud Pub/Sub?在 Google Cloud Pub/Sub 中处理订阅过滤器更改的最佳方式是什么? 【发布时间】:2021-09-22 12:45:34 【问题描述】:

问题: 我知道无法修补 Google Pub/Sub 订阅以更新过滤器。我只是在想其他方法来处理更新以在生产中进行过滤。

我能想出的方法:

    修改推送配置以拉入现有订阅(旧过滤器),以便累积消息 使用最新过滤器创建新订阅 使用数据流将消息从旧订阅传输到主题 从主题中分离旧订阅

我在该方法中看到的问题:

    由于两个订阅同时存在,我最终可能会处理重复的消息

对处理此问题的最佳方法有何建议?

【问题讨论】:

【参考方案1】:

时间对于最大限度地减少重复或消息丢失很重要。

首先,我将部署一个服务(例如 Cloud Run),将 PubSub 消息按原样保存在某个地方(在 Cloud Storage 文件中、在 bigQuery 中、在 Firestore 中……)

然后,同时,我将旧订阅的推送更改为推送到我的 Cloud Run 服务;并使用新过滤器创建新的推送订阅

最后分离订阅。

如果您有能力在您的 REAL 应用中检测已处理的消息,您可以将它们从您的保存位置中删除(例如,使用 BigQuery 更容易),然后仅重新处理丢失的消息。使用数据流,或手动


但是,建议对您的消息进行幂等处理。请记住,PubSub 至少是 1 条传递消息,即使订阅相同,您也可能有重复消息。

【讨论】:

【参考方案2】:

如您所见,一旦创建订阅,过滤表达式就无法更改。要有效地更改过滤器,请执行以下步骤:

    Create a snapshot 现有订阅(订阅 A)。 使用新的过滤器表达式创建一个新订阅(订阅 B)。 为步骤 1 中创建的快照寻求订阅 B。 将您的订阅者更改为使用订阅 B 而不是 A。

请注意,在订阅者从订阅 A 切换到订阅 B 期间,由于消息是在两个订阅上独立确认的,因此传送的重复率会很高。

如果您需要最大程度地减少处理的重复项并且可以承受停机时间,您可以在第 1 步之前停止所有订阅作业/服务器,并在第 4 步之后重新启动它们配置为从新订阅 B 中提取。所有步骤都必须完成完全在配置的message_retention_duration 内,以防止消息丢失。

【讨论】:

以上是关于在 Google Cloud Pub/Sub 中处理订阅过滤器更改的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Cloud Function 上的 Spring Cloud 函数中获取 Pub/Sub 事件的元数据

Google Cloud 上使用 Pub/Sub 的主/从模式

Google Cloud Pub/Sub 中的积压工作

Google Cloud Pub/Sub - Cloud Function & Bigquery - 数据插入未发生

Google Cloud Pub/Sub 确认

为了在 Google Cloud 中启用 Cloud Pub/Sub 作为通知通道,必须做些啥