订阅 Google 云 pub/sub 的 kubernetes pods 的多个副本

Multiple replicas of a kubernetes pods subscribing to a Google cloud pub/sub

我正在 kubernetes pod 上设置服务 运行 并通过请求订阅订阅 pub/sub 主题。该服务将使用推送到主题的消息。

现在我正在将我的 pods 扩展到 10 个副本并观察到有时当有新消息推送到主题时,多个 pods 会同时收到消息。不是 pod 1 在 ackDeadline 之前未能 ack 并且消息被 pod 2 再次拉取的情况,而是 pod 1 和 pod 2 在毫秒内收到相同的消息。

如何设置订阅/kubernetes 以便一次只有一个 pod 接收和处理一条消息?

目前 Pub/Sub 没有 QOS 2(一次且仅一次),因此不幸的是,没有开箱即用的方法来完成您所说的事情。

官方文档在这里:https://cloud.google.com/pubsub/docs/subscriber

建议的方法是使用 Apache Beam 的模型,而不是使用时间 windowing 来确保您所谈论的内容。 Google 有数据流,它作为一个选项托管在 Apache Beam 中。

您可以自己实现的另一种方法(可能很大)是在内存中的某处设置一个变量(可能在您从 Kubernetes 访问的 Memorystore 中),它跟踪最后一次确认的时间戳,并使用 Pub/Sub 中的有序列表。因此每个 pod 都会(按顺序)从 Pub/Sub 获取,并且您将依赖共享内存中的变量来获取最后一条确认消息,而不是 Pub/Sub 的机制。显然,在 K8s 中处理每条消息时,您仍然希望确认每条消息,但现在您还需要在 Memorystore 中设置变量。

我认为应该缩小 window 以解决重入问题,但它仍然存在(访问变量和设置变量之间的延迟仍然足够大,您可以对消息进行双重处理) .

这就是为什么推荐的方式是 window通过 Beam。 Dataflow 也可以任意扩展,所以从性能的角度来看,它可能与 Kubernetes 相同,但它是 Beam,因此需要学习不同的技术栈,它并不简单,但它是完成这项特定工作的工具。