无服务器 – 计划的 Lambda

无服务器 – 计划的 Lambda


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

定时事件

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

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 个字段) – 此通配符指定范围。在前面的通配符示例中,为了指定工作日,而不是指定 5 个逗号分隔值,我们可以简单地编写 MON-FRI

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

  • /(正斜杠,允许除日期以外的 5 个字段) – 此字段指定增量。如果您在小时字段中输入 0/2,则此 cron 将每隔偶数小时运行一次(0、0+2、0+2+2 等)。如果您在 hours 字段中指定 1/2,则此 cron 将每隔奇数小时运行一次(1、1+2、1+2+2 等)。正如您所猜到的,/ 前面的值是起始值,它后面的值定义了增量。

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

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

  • #(仅允许用于星期几) – 这是一个非常特殊的通配符,最好通过示例来理解。假设您希望在母亲节运行一个 cron。现在,母亲节是每年 5 月的第二个星期日。因此,您的月份字段将包含 MAY 或 5。但是如何指定第二个星期日?进入主题标签。表达式为 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 hours) – 每 2 小时触发一次

  • rate(1 day) – 每天触发(UTC 时间 00:00)

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

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

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

参考

觉得文章有用?

点个广告表达一下你的爱意吧 !😁