具有多个 Pod 的 GKE 集群中的 pubsub 拉取订阅

问题描述 投票:0回答:1

我有一个 pubsub 订阅者,它检查 gs 存储桶中的新文件。一旦文件到达 gs 存储桶,我需要解析它并根据存储桶路径中的 id 发送到特定的 bigquery 表。

为此,我有 python 代码,它使用 pubsub 订阅者来检查 gs 存储桶中的新文件。文件到达后,它将检查存储桶路径中的 id,例如 gs://bucket/...//file1.txt。文件可能会到达 6 个 ids 文件夹。根据id号的if else条件,bigquery将执行load_table_from_uri()将其发送到不同的表并ack()或nack()消息。文件可用的频率并不一致,即1分钟内可能有10个GB大小的文件,或者每5分钟有1个文件。我看到 pubsub 已经为 k8 提供了 yml 以及 HPA。

所以,我的问题是,如果我使用带有 3-5 个 Pod 副本的 GKE k8s 集群,所有 Pod 是否可以通过 pubsub 获取相同的 gs 文件路径并同时处理它们,从而在 bigquery 表中产生重复记录?或者它是如何工作的?

另外,我应该对 k8s 集群中每个应用程序的每个 id 使用过滤订阅,还是根据成本和效率,使用 if else 条件的当前设置就可以了?

multithreading kubernetes google-bigquery google-kubernetes-engine google-cloud-pubsub
1个回答
0
投票

如果所有副本都使用相同的订阅,那么消息将在它们之间进行负载平衡。通常,一条消息只会被其中之一接收。但是,Pub/Sub 具有至少一次传送保证,这意味着可以传送重复的消息(包括您调用

ack()
的消息)。在这种情况下,无法保证哪个副本会收到副本;它可能是收到原始交货的货物,也可能是另一艘收到的货物。一般来说,您的订阅者需要能够适应重复交付。

如果您希望每个应用程序接收可以在订阅创建时通过属性确定的特定消息子集,则过滤器非常有用。除了将重复项限制到同一应用程序实例之外,使用过滤器无助于解决重复交付问题。请记住,这种重复可能会在节点重新启动后发生,因此您将无法依赖内存状态来捕获此类重复。

© www.soinside.com 2019 - 2024. All rights reserved.