kubernetes - 订阅 Google Cloud pub/sub 的 kubernetes pod 的多个副本
问题描述
我正在设置一个在 kubernetes pod 上运行的服务,并通过 pull 订阅订阅 pub/sub 主题。该服务将使用推送到该主题的消息。
现在我将我的 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 的模型,而不是使用时间窗口来确保您正在谈论的内容。谷歌有 Dataflow,它作为一个选项托管 Apache Beam。
另一种方法(可能很大),您可以自己实现,是在内存中的某处(可能在您从 Kubernetes 访问的 Memorystore 中)有一个变量,它跟踪最后确认的时间戳,并使用有序列表来自发布/订阅。因此,每个 pod 都会(按顺序)从 Pub/Sub 中获取,并且您将依赖共享内存中的变量来获取最后一条 ack'd 消息,而不是 Pub/Sub 的机制。显然,当您在 K8s 中处理每条消息时,您仍然希望确认每条消息,但现在您还需要在 Memorystore 中设置变量。
我相信应该缩小重新进入问题的窗口,但它仍然存在(访问变量和设置它之间的延迟仍然足够大,您可以双重处理消息)。
这就是为什么推荐的方法是通过 Beam 开窗。Dataflow 也可以任意扩展,因此从性能的角度来看,它可能与 Kubernetes 相同,但它是 Beam,因此需要学习不同的技术堆栈,而且它并不简单,但它是完成这项特定工作的工具。
推荐阅读
- java - 当我从 Spring Boot Jar 运行而不是通过 Eclipse 运行时出现 ClassNotFoundException
- php - 从 json 文件访问 2 个值之一
- r - 根据行索引选择两组列
- javascript - ReactJS:提交表单并根据单选按钮选择调用函数
- bash - 用于运行 Celery Flask 应用程序并发出请求的 Bash 脚本
- java - 我在activity_main.xml中看不到textview和其他元素布局android studio
- javascript - 如何在 Sinon js 中存根一个 jquery 选择器
- c++ - 通过多个类访问成员时出错
- python - 将 Python 中的“*”字符读入新字符串时出现问题
- excel - VBA - 在标准 Excel 函数中使用选定的范围单元格