我需要一个基于Docker/python worker的可伸缩队列处理。我的想法倾向于kubernetes。但是,我不确定最好的控制器/服务。
基于azure函数,我可以将简单的消息添加到一个存储队列中,这些消息需要处理,结果需要反馈到结果队列中。
为了处理这些队列消息,我开发了python代码来循环队列并处理这些作业。每次成功循环后,消息将从源队列中删除,结果将写入结果队列。一旦队列为空,代码就存在了。
所以我创建了一个运行python代码的docker映像。如果启动了多个容器,队列的工作速度显然会更快。我还实现了新的Azure Kubernetes服务来扩展它。当我还是Kubernetes的新手时,我读到了工作模式,即工作队列,直到工作准备就绪。我的简单yaml模板如下所示:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
parallelism: 4
template:
metadata:
name: myjob
spec:
containers:
- name: c
image: repo/image:tag
我现在的问题是,作业无法重新启动。
通常,队列会被一些条目填满,然后有一段时间什么也没有发生。然后,更大的队列可能会到达,需要尽快处理。当然,我想再次运行作业,但这似乎是不可能的。此外,如果队列中没有任何内容,我想将内存占用减少到最小。
所以我的问题是,我应该在这个场景中使用什么样的架构/构造,有简单的yaml示例吗?
3条答案
按热度按时间izj3ouym1#
这可能是一个“愚蠢/笨拙”的答案,但它简单、健壮,我已经在生产系统中使用了几个月了。
我有一个类似的系统,其中有一个队列,有时被清空,有时被关闭。我编写了类似的队列处理器,它一次处理队列中的一条消息,并在队列为空时终止。它被设置为在Kubernetes作业中运行。
诀窍在于:我创建了一个CronJob来定期启动该作业的一个新示例,该作业允许无限的并行性,如果队列为空,它会立即终止(“按比例缩小”);如果队列被关闭,最后一个作业还没有完成,另一个示例会启动(“按比例放大”)。
不需要查询队列和缩放statefulset或任何事情,如果队列为空,也不会消耗任何资源。您可能需要调整CronJob间隔,以微调它对队列填充的React速度,但它应该React得很好。
ymdaylpp2#
这是一种常见的模式,有多种方法可以构建解决方案。
一个常见的解决方案是让一个应用拥有一组工作者,始终轮询您的队列(这可能是您的python脚本,但您需要将其变为服务),通常您会希望使用Kubernetes Deployment,可能会根据队列或CPU的一些指标将Horizontal Pod Autoscaler与Kubernetes Deployment结合使用。
在您的情况下,您可能希望将脚本设置为daemon,并在队列中有任何项目时轮询队列(我假设您已经在使用并行处理争用条件)。然后使用Kubernetes部署来部署此守护进程,然后您可以根据指标或调度进行缩放。
现在已经有很多不同语言的作业调度器了,其中一个非常流行的是Airflow,它已经有了“工作者”的能力,但是这对于一个python脚本来说可能有点过头了。
ovfsdjhp3#
您可以通过以下几种方式使用Keda:
扩展部署
允许您定义希望KEDA基于缩放触发器缩放的Kubernetes部署或StatefulSet。KEDA将监视该服务,并基于发生的事件自动相应地横向/横向缩放资源。
https://keda.sh/docs/2.9/concepts/scaling-deployments/
缩放作业
您还可以将代码作为Kubernetes作业运行和缩放。考虑此选项的主要原因是处理长时间运行的执行。与处理部署中的多个事件不同,对于每个检测到的事件,将调度一个Kubernetes作业。该作业将初始化,从消息源提取一个事件,然后处理完成并终止。
https://keda.sh/docs/2.9/concepts/scaling-jobs/