Cron 基于工作队列的Kubernetes作业调度

Cron 基于工作队列的Kubernetes作业调度,cron,kubernetes,scheduled-tasks,job-scheduling,kubernetes-mesos,Cron,Kubernetes,Scheduled Tasks,Job Scheduling,Kubernetes Mesos,我们正在使用Kubernetes/go-lang编写一个包交付跟踪应用程序。在遇到一个路障之前,一切都很好,在这个路障中,我们有特定的日程安排需求,并且不知道该使用什么。用例是: 一旦一个包裹被分配出去交付,就应该跟踪它的位置 如果包裹到达仓库3小时后仍未分配,我们应将其标记为“明天交货” 一些常见的cron类型的作业 对于#1,我们计划安排一项作业,每10秒轮询一次包的位置。但这是一份一次性的工作。一旦包裹送达。它应该消失 对于#2,我们计划安排一个定时/cron作业,该作业将由我们的API触

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

  • 一旦一个包裹被分配出去交付,就应该跟踪它的位置
  • 如果包裹到达仓库3小时后仍未分配,我们应将其标记为“明天交货”
  • 一些常见的cron类型的作业
  • 对于#1,我们计划安排一项作业,每10秒轮询一次包的位置。但这是一份一次性的工作。一旦包裹送达。它应该消失

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

    我们上面的#3是用于各种内部目的的常用cron作业

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

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

  • 我们可以从源代码创建这些工作吗?如前所述,这是可能的。但我不确定我们的系统管理员是否允许我们这样做
  • 我读过Kubernetes中的工作队列,我们可以将工作推送到工作队列,消费者将为这些工作项创建工作

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

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

  • 我也听说过,但不确定这将如何适应库伯内特的世界


    我对Kubernetes/Golang一般来说都是新手,没有在google上找到任何具体的参考资料、指针、链接或建议,我将不胜感激。

    有多少软件包?你提到的时间间隔有多重要?我想到了几种方法:

    Kubernetes可以按计划运行,大概可以解决您的第三个需求。如果您有“一些”包(我不一定尝试使用超过“数百个”的包),那么对于每个包,您可以创建一个新的cron作业,该作业运行一次,然后删除自身。Cron作业的运行频率不能超过每分钟一次。如果您可以将“每10秒轮询一次”的要求放宽为“每分钟轮询一次”,并且包的数量很小,那么您可以通过这种方式完成所有操作

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

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


    最后,您可以使用消息队列系统。这是一个流行的开源选择。您可以安排邮件延迟(将邮件发送到exchange
    包。在路由到队列
    包的
    中等待
    10秒,将该队列设置为
    包。就绪
    ,将其发送到队列
    包。退出
    ,并让应用程序使用该队列)。同样,您需要编写一个长期运行的流程;这个程序从队列中获取项目,从数据库中检索它们的状态,轮询它们的当前位置,并将它们标记为“明天送达”,或者根据需要在
    package.in
    中重新查询它们。这是最可扩展的答案(您可以通过Kubernetes部署启动许多工作人员),但也可以使用内置Kubernetes部件的最少功能。

    我们的缩放需求并不是那么大。我们目前不会超过200个包。您是否建议对作业类型1和2使用消息队列,对作业类型3使用常规cron作业?对于上面的类型2,如果我使用RabbitMQ,我会在3小时后将这些作业推送到队列中,还是消息会立即放入队列中,但会在3小时后被消耗?类似地,对于上面的类型1,我们是否会将作业立即推送到队列中?每个围棋程序都会在睡眠10秒后轮询位置?你有什么资源可以让我在Kafka/Redis中实现这种死信交换吗?(3)如果你对它的最佳描述是“例行cron作业”,那么Kubernetes CronJob可能是一个很好的匹配。在(1)和(2)上,如果你有一个作业在包交付之前每10秒运行一次,如果包裹还没有送达,它将在3小时后运行。所以我的几个解决方案结合了这些。特别是,我对RabbitMQ设置的描述基本上只有一个队列,其中消息在10秒的延迟后传递,这两个延迟都完成了。如果需要,可以实现一个类似的队列,延迟3小时。RabbitMQ代理本身实现延迟(通过TTL/DLX技巧),当消息准备就绪时,作业将持续消耗消息。您可以非常轻松地在Redis上实现一个简单的作业队列,特别是如果您使用排序集,其中