Scheduler

设想您经营一家服装网店。当顾客买走最后一件商品时,这件商品的库存就变成 0。要想继续开卖,就得向供货商下订单。假设供货商有一个接收订单的窗口开在互联网上,只要访问约定好的地址,订单就会被受理。再假设您已经把“找出库存为 0 的商品并调用那个窗口”这件事做成了一个 Script。可即便如此,还剩一个问题:每天都需要有人去点一次那个 Script

Scheduler 就替代了这个人。只要设定一次“每天在同一时刻运行这个 Script”,每到那个时刻,WEEGLOO 就会自动运行。谁都不用打开画面。

可以把它比作调好一个闹钟。只要设定一次几点响铃,之后每天到那个时刻它就会自动响起。本页以服装店的“库存补货”为例,来看看在 Scheduler 中要设定什么、时刻要怎么填写,以及它是以谁的权限来运行的。

要设定的三件事

一个 Scheduler 要设定的东西并不多。

  • 名称:用于日后在列表中辨认它。例如 库存补货
  • 要执行的 Script:选择到时刻就运行的一个 Script。一个 Scheduler 只运行一个 Script
  • 何时运行:在下方 填写运行时间的方法 中介绍。

除此之外,还有一个开关。关掉它后,设定会照样保留,只是不再运行。像供货商休息的那段时间那样需要暂时停下时,不必删除它。

要执行的 Script 之后无法更换。 想运行别的 Script,就要新建一个 Scheduler。名称、时刻和开关随时都可以修改。

填写运行时间的方法

运行时间用五个部分来填写。从左到右依次是 分、时、日、月、星期* 表示“全部”。

分  时  日  月  星期
0   9   *   *   *      → 每天 9 点整

常用的写法如下。

填写的值何时运行
0 0 * * *每天 0 点整
30 9 * * *每天 9 点 30 分
0 * * * *每小时整点
*/10 * * * *每 10 分钟
0 0 * * 1每周一 0 点整
0 0 1 * *每月 1 日 0 点整

时间以标准时间(UTC)来解读。 它不是本地时间,因此要按时差算好之后再填写。如果是比标准时间快 9 个小时的地区,那么当地的早上 9 点就是 0 0 * * *。库存补货就用这个值,也就是在标准时间 0 点运行。

含有日期或星期的时刻,这样的换算可能把日期也一并推移,所以请再确认一次。

一次都不会运行的值无法保存。 例如 0 0 30 2 * 指向 2 月 30 日,而这样的日子永远不会到来,所以试图保存时,会收到请您重新确认该值的响应。

以谁的权限运行

Scheduler 运行 Script 时,这次运行会被视为创建该 Scheduler 的人所执行的。库存补货 Script 读取商品、调用供货商,也都是以创建者的身份发生的。

因此,无论是创建还是修改,都需要同时具备两种权限。

  • 角色(SpaceRole)中必须具备 Scheduler 的设置权限。
  • 必须具备运行该 Scheduler 要执行的 Script 的权限

第二种权限不仅在创建时确认,修改时也会确认。因为更改运行时刻,就是在决定何时执行那个 Script;把关闭的重新打开,就是在开始执行。

如果创建者之后失去了该权限,Scheduler 就会被关闭。 当负责人离开团队,或角色被收窄时,WEEGLOO 会在下一个运行时刻确认这一点,并在不运行的情况下关掉开关。即使权限恢复,开关也不会自动开启,因此需要您亲手重新开启。

查看执行记录

Scheduler 每运行一次,就会留下一条记录。那一次是成功还是失败,就记在这里。昨晚的订单是否真的发出去了,用这条记录来确认。

列表中会显示每一次的执行时间和结果。点击运行中失败的那一次,就能在详情画面的错误区域里原样看到失败的原因。 它会和耗费的时间一起显示,因此可以凭这段文字分辨出,是供货商窗口没有响应,还是别的问题。

成功的执行记录会在 1 小时后消失,失败的执行记录会在 3 天后消失。 失败的一方留得更久,是因为日后会去查看的正是那一方。如果是像订单明细那样需要保留更久的值,就在 Script 内把它保存为 Content

即使失败,Scheduler 也不会停下。如果是因为供货商窗口一时没有响应而失败,那么只有那一次会被记为失败,到下一个时刻会再次运行。

与 Webhook 有何不同

两者相同之处在于,都无需人去点,就能运行 Script。不同之处在于,是什么在触发运行

  • Webhook有事情发生时运行。比如商品被上架时,内容被发布时。
  • Scheduler到了时刻时运行。哪怕什么都没发生,也会每天在那个时刻运行。

库存补货乍看之下像是该用 Webhook。因为在库存变成 0 的那一刻下单就行了。可是,如果同一件商品的库存在一天之内先变成 0、又因退货而回升、然后再次变成 0,那么每一次都会发出订单。而如果每天汇总起来查看一遍,那么一件商品就只对应一份订单。需要“汇总后一次处理”而不是“每次发生就处理”的工作,正是 Scheduler 的用武之地。

反过来,在商品上架的那一刻填充说明这件事没有理由拖延,所以该用 Webhook

需要了解的事项

  • 数量有上限。 一个 Organization 能拥有的 Scheduler 数量按套餐分别设定(Free 1 个、Basic 5 个、Pro 30 个、Enterprise 无限制)。达到上限后就无法新建,删除不用的就会重新空出一个名额。
  • 执行次数与 Script 共用。 Scheduler 所做的事就是运行 Script,因此每运行一次,就会用掉套餐中的一次 Script 执行次数。Scheduler 没有单独的上限。这个次数用完之后,此后到达运行时刻的 Scheduler 就不会运行而被关闭。这种情况下,为什么没能开始运行,会记录在执行记录中。即使到了下个月也不会自动开启,因此需要您亲手重新开启。
  • 错过的运行不会补上。 即使因为维护等原因漏过了一天,第二天也不会运行两次。而是从下一个时刻起重新运行。
  • 某个 Scheduler 使用的 Script 无法删除。 即使那个 Scheduler 已关闭,也一样。请先删除那个 Scheduler,再删除 Script

在内容工作室中管理

Scheduler 在内容工作室的 Scheduler 画面中创建和管理。列表中会把创建好的 Scheduler 连同名称、要执行的 Script 的名称、cron 表达式、下次执行、状态、更新时间和更新者一起,每个显示为一行。

Scheduler 列表画面。“库存补货”与名称、Script、cron 表达式、下次执行、状态 Active 一起显示为一行的状态。cron 栏头标有 UTC,下次执行栏头标有 UTC±N

画面还会一并告诉您这两栏各自用的是哪个时钟。写有 cron 表达式那一栏的栏头会标上 UTC下次执行 栏的栏头则会标上查看者所在的时区,比如 UTC±N。这样,保存的值以及它按您的时间是几点,就能在同一行里看到。在比标准时间慢的时区,下次执行 可能会显示为前一天。

新的 Scheduler 通过列表右上角的 创建 按钮来创建。

  1. 点击列表右上角的 创建 按钮。
  2. 在名称栏中输入 库存补货
  3. 请开启 启用。关掉后虽然能保存,但不会运行。
  4. 要执行的 Script 中选择库存补货 Script
  5. 执行周期 中选择 手动输入
  6. 在五个部分中输入 0 0 * * *
  7. 点击右上角的 创建 按钮进行保存。

画面还会当即显示您输入的表达式实际会在什么时候运行。它会提示手动输入的表达式以标准时间(UTC)保存,并一并显示将要保存的 cron 值和下次执行时刻的预览。

新建 Scheduler 画面。已填入名称“库存补货”、启用已开启、要执行的 Script 选为“库存补货”、执行周期用手动输入的方式填入 0 0 * * * 的状态

在列表中点击某一个 Scheduler,就会打开这个 Scheduler 的详情画面。详情画面分为 执行日志设置 两个选项卡,初次打开时显示的是 执行日志执行日志 选项卡中,至今运行过的每一次会显示为一行,每一行都会显示 执行时间结果,以及指向这一次的 请求 ID。用 结果 栏可以只挑出成功的那些或只挑出失败的那些,点击 刷新日志 就会把刚刚运行的那一次也重新读取进来。

Scheduler 详情画面的执行日志选项卡。“库存补货”的三次执行(失败 2 次、成功 1 次)以执行时间、结果、请求 ID 各列显示的状态

点击其中一次,就会打开这一次的详情。这里会显示 结果,以及 状态码、耗费的时间(耗时)、这一次是以谁的身份运行的(Run as),如果是失败的那一次,失败的原因就会原样显示在 错误 区域中。上方有一个徽章,标明这一次属于哪个 Scheduler、运行的是哪个 Script,旁边还有通往那个 Script 的链接,以及到 Script 那边的记录中查看同一次运行的 在 Script 日志中查看 链接。

Scheduler 执行日志详情画面(失败的那一次)。执行时间、请求 ID 与结果 Failure、状态码、耗时、Run as 一起显示,错误区域中可见失败原因的状态

接下来要做的事

  • Script:介绍如何创建 Scheduler 要执行的 Script,以及如何在其中编排像调用供货商窗口那样调用外部服务的动作。
  • Webhook:介绍如何让它不是在固定时刻,而是在预定的变化发生时运行。
  • 角色与权限:介绍如何把 Scheduler 的设置权限和 Script 的执行权限装入角色。