繁体   English   中英

订阅 Google 云发布/订阅的 kubernetes pod 的多个副本

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

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

现在我将我的 pod 扩展到 10 个副本,并观察到有时当有新消息推送到主题时,多个 pod 会同时收到消息。 这不是 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 的模型,而不是它使用时间窗口来确保您正在谈论的内容。 Google 有 Dataflow,它作为一个选项托管 Apache Beam。

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

我相信应该缩小重入问题的窗口,但它仍然存在(访问变量和设置它之间的延迟仍然足够大,您可以对消息进行双重处理)。

这就是为什么推荐的方法是通过 Beam 开窗的原因。 Dataflow 也可以任意放大,所以从性能的角度来看,它可能与 Kubernetes 相同,但它是 Beam,所以要学习不同的技术堆栈,它并不简单,但它是这项特定工作的工具。

顺便说一下怎么实现相反的? 如果我需要将消息推送到同一部署的所有实例。 例如,我有 >1 个副本的部署,需要将配置或某种信号推送到所有实例。 在 pod bootstrap 期间创建新订阅可能不是一个好主意,因为 pod 可能随时死亡并且最后会有许多废弃的订阅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM