在 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 的主/从模式