无服务器 - 预定的 Lambda


通常,您需要以固定的时间间隔调用您的函数。可以是每天一次、每周两次、工作日每分钟一次等等。Serverless 提供两种类型的事件来以固定频率调用函数。它们是 cron 事件和rate 事件。

计划任务事件

cron 事件比rate 事件具有更大的灵活性。唯一的缺点是它不如利率事件那么容易理解。AWS 文档中定义了 cron 表达式的语法-

cron(minutes hours day-of-month month day-of-week year)

可以看出,cron 表达式由 6 个字段组成。每个字段都可以接受一些可接受的值,以及一些(AWS 称之为通配符)

让我们先看看可接受的值 -

  • 分钟- 0-59

  • 小时- 0-23

  • 一个月中的某一天- 1-31

  • − 1-12 或 JAN-DEC

  • 星期几- 1-7 或 SUN-SAT

  • - 1970-2199

现在接受的值已经很清楚了,让我们看一下通配符。cron 表达式中总共有 8 个可能的通配符(有些允许所有 6 个字段,有些仅适用于特定字段)。将它们列在这里 -

  • *(星号,允许所有 6 个字段) - 这是最流行的通配符。它只是说包含该字段的所有值。小时字段中的 * 表示 cron 每小时运行一次。日期字段中的 * 表示 cron 将每天运行。

  • ,(逗号,允许所有 6 个字段) - 这用于指定多个值。例如。如果您希望 cron 在每小时的第 5、7 和 9 分钟运行,您的分钟字段将类似于 5,7,9。同样,星期几中的 MON,TUE,WED,THU,FRI字段可能意味着 cron 应该只在工作日运行。

  • -(破折号,允许所有 6 个字段) - 此通配符指定范围。在前面的通配符示例中,为了指定工作日,我们可以简单地写为 MON-FRI,而不是指定 5 个逗号分隔值

  • ?(问号,仅允许用于月份中的某一天和星期几) - 这就像一个无关通配符。如果您在星期几字段中指定了 MON,则您不必关心星期一是哪一天。因此,您将输入?代替月份中的某一天。同样,如果您希望 cron 在每个月的 5 日运行,您将在日期字段中输入 5,然后输入 ? 在星期几字段中,因为您不关心每个月的 5 号是哪一天。请注意,AWS 文档明确指出您不能将 * 用于星期几和月份字段。如果您使用 * 作为其中之一,则必须使用 ? 对于另一个

  • /(正斜杠,允许用于除月份之外的 5 个字段) - 该字段指定增量。如果您在小时字段中输入 0/2,则该 cron 将每隔偶数小时运行一次(0、0+2、0+2+2 等)。如果您在小时字段中指定 1/2,则此 cron 将每隔奇数小时运行一次(1、1+2、1+2+2 等)。正如您所猜测的,/ 之前的值是起始值,其之后的值定义增量。

  • L(仅允许用于月份中的某一天和星期几) - 指定该月的最后一天或一周的最后一天

  • W(仅允许用于月份中的某一天) - 这指定最接近该月特定日期的工作日(周一至周五)。因此,如果您在日期字段中指定 8W,并且它对应于工作日(例如星期二),那么 cron 将在 8 号本身触发。但如果 8 对应周末,比如周六,那么 cron 将会在 7 日(周五)触发。如果 8 日对应星期日,则 cron 将在 9 日(星期一)触发。这是最少使用的通配符之一。

  • #(仅允许用于星期几) - 这是一个非常特殊的通配符,最好通过示例来理解。假设您希望在母亲节运行一个 cron。现在,母亲节是每年 5 月的第 2 个星期日。因此,您的月份字段将包含 MAY 或 5。但是如何指定第 2 个星期日呢?进来主题标签。表达式为0#2。通配符前面的值是星期几(0 表示星期日,1 表示星期一,依此类推)。通配符后面的值指定出现的情况。因此,这里的2指的是第二次出现的星期日或第二个星期日。

现在,要为 lambda 函数定义 cron 触发器,您所需要做的就是在 serverless.yml 函数的 events 键中指定 cron 表达式。

functions:
   cron_triggered_lambda:
      handler: handler.hello
      events:
         - schedule: cron(10 03 * * ? *) #run at 03:10 (UTC) every day. 

一些例子

下面给出了 cron 表达式的一些示例 -

  • cron(30 15 ? * MON-FRI *) - 每个工作日 15:30 (UTC) 触发

  • cron(0 9 ? 6 0#3 *) - 在六月第三个星期日(父亲节)09:00(UTC)触发

  • cron(0/15 * ? * MON *) - 周一每 15 分钟触发一次

  • cron(0/30 9-18 ? * MON-FRI *) - 工作日上午 9 点到下午 5:30 每 30 分钟触发一次(对应于多个地方的办公时间)

评价事件

与 cron 表达式相比,这要简单得多。语法很简单:rate(value unit)。例如,速率(5 分钟)。

该值可以是任何正整数,允许的单位是分钟、小时、天。

为 lambda 函数定义速率触发器与定义 cron 触发器类似。

functions:
   rate_triggered_lambda:
      handler: handler.hello
      events:
         - schedule: rate(10 minutes) #run every 10 minutes

一些例子

  • rate(2 小时) − 每 2 小时触发一次

  • 速率(1 天) - 每天触发(在 00:00 UTC)

  • rate(90 分钟) − 每 90 分钟触发一次

正如您所意识到的,利率表达式的简单性是以降低灵活性为代价的。您可以使用每 N 分钟/小时/天运行一次的 lambda 速率。要执行任何更复杂的操作,例如仅在工作日触发 lambda,您必须使用 cron 表达式。

请注意,如果您的 cron 表达式以某种方式导致触发时间少于一分钟,则它将不受支持。

参考