0

我们正在使用 Kubernetes/go-lang 编写一个包裹递送跟踪器应用程序。一切都很好,直到我们遇到了我们有某些调度需求的路障,并且无法弄清楚该使用什么。用例是:

  1. 一旦包裹被分配并送出,应跟踪其位置。
  2. 如果包裹到达仓库3小时后仍未分配,我们应标记为“明天发货”。
  3. 一些常见的 cron 类型的工作。

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

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

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

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

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

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

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

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

我也听说过Kala,但不确定这将如何适应 Kubernetes 世界。

任何参考、指针、链接或建议都将受到高度赞赏,因为我对 Kubernetes/Golang 很陌生,而且在谷歌上也找不到任何具体的东西。

4

1 回答 1

1

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

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

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

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

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

于 2018-07-22T11:10:13.917 回答