2

问题

我需要一个比标准 FIFO 或优先级队列复杂得多的作业队列系统。队列主要需要像标准的 FIFO 队列一样工作,但在作业的出队和运行方面有更复杂的逻辑。在我的情况下,只有在不超过某些用户和系统并发限制的情况下,才应该出队作业(例如,用户只能有 10 个特定类型的并发作业,整个系统只能有 100 个并发作业某种类型等)

目标是让一个 kubernetes 集群成为这个队列的消费者,如果满足所有必要条件,k8 将把作业出列并启动一个新容器来运行它。我不是 k8 的专家,但我认为我们不能让 k8 在对给定作业出队之前运行这些并发检查。所以,我认为我需要的是一个作业队列系统,它通过只允许通过某些检查的作业出列来将这些检查放入队列本身。

我们尝试了什么

我们已经使用 sql 数据库实现了我们自己的作业队列系统。此数据库中有一个主作业队列表,其中包含每个作业的信息。然后,我们创建了自己的应用程序,该应用程序定期(每 10 秒左右)在该表上运行复杂的查询,以确定哪些作业应该出列并运行。然后这个应用程序启动工作进程来运行这些作业(不是在容器中,只是标准进程)。

这种方法有几个问题。首先,查找准备运行的作业的查询非常复杂且缓慢。此外,当系统上有大量活动时,作业队列表可能成为整个系统的巨大瓶颈。此外,由于我们希望开始在它们自己的 docker 容器中运行这些工作进程,因此如果可能的话,我们希望 Kubernetes 集群成为队列的直接消费者,而不是让我们自己的应用程序作为中介。

问题

有哪些流行的方法来处理复杂的作业队列?我无法想象我们是唯一需要施加并发限制的作业队列的人,我也无法想象我们的 SQL 方法是实现我们需要的最佳方式。在这种情况下,我们可以做些什么来使我们的作业队列系统尽可能高效?

4

0 回答 0