kubernetes - 如何制作容错数据处理 k8s pod?
问题描述
我们在 GKE 上有一个图像处理管道,它来自 GCP 主题,而 GCP 主题又由存储桶通知提供,即
image upload > bucket > notification > topic < pods consume files off topic.
这可以很好地扩展,但有时 pod 会死亡或缩小,并且它们会从它们消费的主题中获取数据。是否有容器设计模式来确保即使 pod 意外死亡也能处理文件?
(在处理数百万个图像文件时,整理遗漏的内容是一场噩梦)。
解决方案
是的,我想了很久,想出了一个 2 队列解决方案,我将称之为 Accountant pod/container(因为这个想法基于复式记账):
- 工作被发布到 2 个队列,Q1 和 Q2
- 工人处理 Q1 弹出项目直到它为空
- 当 Q1 为空时,会计 pod 会通过 Q2 检查每个工作的预期输出。如果缺少某些东西,则再次将其放回 Q1 和 Q2(在 Q2 耗尽后)。
- 重复,直到会计师没有将任何内容返回到队列中。
我称之为:复式/会计设计模式:)
我认为这可以应用于大多数数据处理队列系统。
我看到的唯一缺陷是会计师是否死了(但检查输入与输出应该是一项轻量级的工作)。我想那么你可以有 N-1 会计师的 N 队列,这取决于你想要的确定程度(但协调超过 1 名会计师可能会很棘手)
推荐阅读
- javascript - 如何在现代浏览器中全局监听获取完成?
- python - 调整 for 循环以仅根据 df 中的出现频率返回值
- authentication - Spring security:基于自定义逻辑而不只是 URL 请求登录
- angular - 在 Angular 和 Ionic 项目之间导入服务时,'inject() 必须从注入上下文中调用'
- javascript - Firebase 和 Vuex:为什么用户配置文件文档在页面刷新之前不存在?
- scala - 如何使用 scalac 编译具有依赖项的类?
- c++ - ARM64上的多播“没有这样的设备”?
- docker - 发出 EC2 停止实例时如何使用 docker-compose down 优雅地停止 docker 服务
- java - 使用反射库时出现 UnsupportedClassVersionError: JVMCFRE003 错误
- python - 如何在 Python 中提取一个字典的键和值