Serverless教程

Serverless Lambda

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

Cron 事件

cron 事件比 rate 事件具有更大的灵活性。唯一的缺点是它不像利率事件那样容易理解。 cron 表达式的语法在 AWS 文档中定义-
cron(minutes hours day-of-month month day-of-week year)
可以看出,cron 表达式由 6 个字段组成。每个字段都可以接受一些可接受的值,还有一些,如 AWS 所称, 通配符
让我们先看看接受的值-
minutes-0-59 hours-0-23 day-of-month-1-31 month-1-12 或 1-12 月 day-of-week-1-7 或 SUN-SAT year-1970-2199
既然接受的值很明确,让我们看看通配符。 cron 表达式中总共可能有 8 个通配符(有些允许所有 6 个字段,有些仅适用于特定字段)。列出它们 h之前-
*(星号,允许用于所有 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 表达式以某种方式导致触发时间少于一分钟,则将不支持它。

参考文献

AWS 预定事件 使用速率的预定表达式或 cron
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4