使用工作队列的Kubernetes作业调度



我们正在使用Kubernetes/go-lang编写一个包交付跟踪器应用程序。一切都很好,直到我们遇到了一个路障,我们有特定的日程安排需求,却不知道该用什么。用例是:

  1. 一旦包裹被分配并交付,就应该跟踪其位置
  2. 如果包裹在到达仓库3小时后仍未分配,我们应将其标记为"明天发货">
  3. 一些常见的cron类型的作业

对于#1,我们计划安排一项作业,每10秒轮询一次包裹的位置。但这只是一次工作。包裹交付后。它应该会消亡。

对于#2,我们计划安排一个定时/cron作业,该作业将由我们的API触发。这项工作将安排在仓库收到包裹后的3个小时内进行。

我们上面的#3是一个常见的cron作业,用于各种内部目的。

我们希望使用单一的调度平台来满足所有这些类型的需求。

由于我们只使用Kubernetes,我们希望利用它的作业调度功能。但我们对此有一定的怀疑。

  1. 我们可以从源代码中创建这些作业吗?正如这里提到的那样,这是可能的。但我不确定我们的系统管理员是否会允许我们这样做
  2. 我读过Kubernetes中的工作队列,在那里我们可以将工作推送到工作队列,消费者将为这些工作项创建工作。

    但是,我不知道如何为该工作队列创建一个永久的使用者守护进程,它将轮询该队列并为每个工作项创建作业。

    另一个疑问是如何在这里安排简单的cron作业(上面的#3(。

我也听说过卡拉,但不确定它在Kubernetes世界中的适用性。

任何参考、指针、链接或建议都将不胜感激,因为我对Kubernetes/Golang还很陌生,在谷歌上也找不到任何具体的东西。

有多少个包?你提到的时间间隔有多重要?脑海中浮现出几种方法:

Kubernetes cron作业可以按计划运行,大概可以解决您的第三个需求。如果你有"一些"包(我不一定会尝试超过"数百"个(,那么你可以为每个包创建一个新的cron作业,它运行一次,然后删除自己。Cron作业的运行频率不能超过每分钟一次。如果你可以将"每10秒投票一次"的要求放宽为"每分钟投票一次",并且包裹数量很少,你可以用这种方式做任何事情。

对于第二个要求,您可以每隔一段时间检查每个包是否过期。如果"3小时后"的要求不是特别严格,效果会更好。编写一个程序,查看每个包的,如果三小时的延迟已经过去,则更改其状态,然后编写一个每15分钟运行一次的cron作业。围绕这一点的扩展问题有所不同,但"查找过期包"听起来像是一个SQL查询;这取决于您的后端技术。

您可以编写一个执行所有基于间隔的检查的长期运行程序。您可以提示使用Go,并且可以设置每10秒触发一次的time.Timer(可以为整个程序触发一次,也可以为每个程序包触发一次(。我可能会让程序在内存中知道每个包ID、其当前状态,以及何时需要将状态更改为"明天交付",并在一个进程中运行所有这些。一个普通的部署可以处理这个问题。您还应该将此状态保存在数据库中,这可能会引入一些扩展限制。

最后,您可以使用消息队列系统。RabbitMQ是一个流行的开源选择。您可以安排消息延迟(将消息发送到路由到TTL为10秒的队列package.wait的交换package.in,将该队列的死信交换设置为package.ready,将其发送到队列package.out,并让应用程序从该队列消费(。同样,您需要编写一个长时间运行的流程;这个从队列中获取项目,从数据库中检索它们的状态,轮询它们的当前位置,并将它们标记为"明天交付",或者在package.in中重新排队(视情况而定(。这是最具可扩展性的答案(您可以通过Kubernetes部署启动许多工作程序(,但也最少使用内置的Kubernete部件。

最新更新