sae crop 文档

时间:2022-03-07 14:37:43

原文是google缓存:
http://webcache.googleusercontent.com/search?q=cache:MD_FP-G6RI8J:sae.sina.com.cn/%3Fm%3Ddevcenter%26catId%3D26%26content_id%3D70+&cd=2&hl=zh-CN&ct=clnk&gl=cn

服务概要

Cron服务是SAE为开发者提供的分布式定时服务,用来定时触发开发者的特定动作,满足比如定时计算排行榜等需求。Cron的设置是通过App的config.yaml来实现的,只要用户在App目录下的config.yaml里按照我们的提供的语法格式进行配置,部署后就能生效。Cron的执行是以HTTP方式触发的,触发后真正执行的是用户在App中的PHP代码。Cron服务是分布式环境部署的,具有高可靠性,多点之间相互隔离且同时触发,并且通过分布式锁进行选举并最终由一个健康节点执行。

特别注意:

  • Cron的任务执行因为是以HTTP方式(GET),所以运行时间有上限,不得超过300秒;如果用户有超过300秒的任务需要定时触发,可以将其分解成多个cron,或者将任务放入TaskQueue或者DeferredJob来异步的执行。
  • Cron的任务执行存在一定的时间误差,最大不超过10秒。
  • Cron不分App版本,只对默认版本生效,当切换代码默认版本时cron会重新配置,切换成当前默认版本下的cron配置。
  • 每个App最多32条cron
  • Cron任务的间隔的最小时间衡量单元是分钟。
  • Cron任务里有两类:每隔一段时间执行和特定时间执行;其中每隔一段时间执行的任务又分为随机偏移执行的任务和指定偏移执行的任务,这两种任务对SAE平台的消耗不一样,所以指定偏移的Cron-offset的资源消耗费用要比随机偏移的Cron-nooffset的资源消耗费用高。
  • Cron支持设定时间区间,比如只在上午10点到下午5点间运行,或者只在1月24日至3月16日运行。
  • 多个cron的url不能完全相同,如果多个cron中使用了相同的url,后面的cron会覆盖前面的cron。一般添加无用的参数如"&cron=1"对相同的url加以区分可以避免覆盖。
  • 普通应用cron的并发限制为10。同一时间最多只能有10个cron任务执行,多出的任务将不能被执行。

应用场景

Cron服务主要提供两类的定时需求:

A、每隔一定时间执行,如每隔2个小时执行1次。

B、在某个特定时间点执行,如每周二晚上9:10执行。

针对A应用场景,Cron提供偏移offset功能,也就是用户可以显式指定偏移时间,否则,默认针对间隔时间做随机偏移。

Cron服务支持http basic auth,用户可以设置用户名和密码来控制访问。

服务限制与配额

SAE设置服务限制和配额的目的是为了防止个别用户攻击和滥用,从而在公有云计算平台上保证绝大多数开发者的正常使用.

1、服务限制和配额设定是在门户网站新浪自身长期运维的基础上经过严格计算得出的,所以正常使用一般不会出现问题。经过SAE    实际统计,99%的应用不会受到任何影响

2、当您发现您的某项服务超过限制或者超配时,请先阅读相关文档确认限制和配额的具体数值,再检查自己的程序是否存在使用不    当的情况,如果仍然解决不了,可以和SAE官方联系,saemail@sina.cn

服务限制

单App最大条目 32
单次最大执行时长 300秒

分钟配额

服务 请求数 cpu时间 流入带宽 流出带宽
Cron/offset 50 50s 1MB 1MB
Cron/nooffset 200 60s 5MB 5MB

备注和说明

限制

Cron的任务执行存在一定的时间误差,最大不超过10秒。

    每个App最多32条cron

    Cron任务的间隔的最小时间衡量单元是分钟

cron syatax

(descripted by EBNF, started by conf)

USERNAME = [a-zA-Z0-9]+

PASSWORD = [a-zA-Z0-9]+

INT = 0|([1-9]+[0-9]*)

STRING = [^\n]*

ORDINAL = $INT

MON = 'Monday' | 'monday' | 'Mon' | 'MON'

TUE = 'Tuesday' | 'tuesday' | 'Tue' | 'TUE'

WED = 'Wednesday' | 'wednesday' | 'Wed' | 'WED'

THU = 'Thursday' | 'thursday' | 'Thu' | 'THU'

FRI = 'Friday' | 'friday' | 'Fri' | 'FRI'

SAT = 'Saturday' | 'saturday' | 'Sat' | 'SAT'

SUN = 'Sunday' | 'sunday' | 'Sun' | 'SUN'

DAYS = MON | TUE | WED | THU | FRI | SAT | SUN | 'day' | 'days'

JAN = 'January' | 'january' | 'Jan' | 'JAN'

FEB = 'February' | 'february' | 'Feb' | 'FEB'

MAR = 'March' | 'march' | 'Mar' | 'MAR'

APR = 'April' | 'april' | 'Apr' | 'APR'

MAY = 'May' | 'may' | 'MAY'

JUN = 'June' | 'june' | 'Jun' | 'JUN'

JUL = 'July' | 'july' | 'Jul' | 'JUL'

AUG = 'August' | 'argust' | 'Aug' | 'AUG'

SEP = 'September' | 'september' | 'Sep' | 'SEP'

OCT = 'October' | 'october' | 'Oct' | 'OCT'

NOV = 'November' | 'november' | 'Nov' | 'NOV'

DEC = 'Decemer' | 'december' | 'Dec' | 'DEC'

MONTHS = JAN | FEB | MAR | APR | MAY |JUN | JUL | AUG | SEP | OCT | NOV | DEC | 'month'

MIN = 'min' | 'mins' | 'minute' | 'minutes'

HOUR = 'hour' | 'hours'

DAYPOINT = [1970-2038].[1-12].[1-31]

TIME = [0-23]:[0-59]

DATETIME = [0-9]{12}

timezone_expreesion = 'Beijing' | 'NewYork' | 'London' | 'Sydney' | 'Moscow' | 'Berlin'

| 'Tokyo' | 'LosAngeles' | 'BJ' | 'NY' | 'LON' | 'SYD' | 'MOS' | 'LA'

timer_expression=

  'every'  INT  MIN  (  

                       (, 'from'  DAYPOINT  TIME)  ('to'  DAYPOINT  TIME)?
                        |
                       (, 'from'  [DAYPOINT | TIME])  ('to'  [DAYPOINT | TIME])?
                     )
  |
   every'  INT  HOUR (,'offset' INT MIN)? (
                                            (,'from'  DAYPOINT  TIME)  ('to'  
  DAYPOINT  TIME)?
                                            |
                                            (, 'from'  [DAYPOINT | TIME])  ('to'  
  [DAYPOINT | TIME])?
                                             )
  |
  ['every'  |  ORDINAL]  DAYS  'of'  MONTHS  TIME  (
                                                    (,'from'  DAYPOINT  TIME)  ('to'  
  DAYPOINT  TIME)?
                                                    |        

                                                    (,'from'  DAYPOINT )  ('to'  DAYPOINT)?
|
crontab unix syntax

  item=

  '-'

  (description: STRING)?

  url: URL

  schedule: timer_expression

  (timezone: timezone_expression)?

  (login: USERNAME@PASSWORD)?

  (times: INT)?

  conf = item{1,32}

crontab unix syntax

cron_unix的语法形式如下:

    *     *     *   *    *        command to be executed
    -     -     -   -    -
    |     |     |   |    |
    |     |     |   |    +----- day of week (0 - 6) (Sunday=0)
    |     |     |   +------- month (1 - 12)
    |     |     +--------- day of        month (1 - 31)
    |     +----------- hour (0 - 23)
    +------------- min (0 - 59)
    如果某一项设置了多个参数,可以用“,”隔开,例如3,4,5,6这样。
    如果是几个连续的数字构成的参数,可以用用“-”吧首尾相连,例如3-6。
    详细参见:crontab使用 http://adminschoice.com/crontab-quick-reference

第三方工具

第三方开发的生成Cron的小工具 http://saetools.sinaapp.com/cron.html

 

PHP调用方式

使用指南

例子:

    appname: saetest
    appversion: 1    Cron使用类自然语言描述,学习成本很低,基本靠几个例子即可熟悉学会。

Cron最新支持unix的crontab语法,可以同时在分钟、小时、天、月和星期位置上进行各种组合设置,时间设置的精度为分钟,方便习 惯于写crontab的系统管理员使用。

增加Cron

编辑saetest/1/config.yaml,增加cron段,config.yaml示例如下:

name: saetest
version: 1
- description: cron test
  url: mycron/test.php
  schedule: $2 day of october 19:00
  timezone: Beijing
- description: another cron test
  url: mycron/another_test.php
  schedule: every 10 mins
  timezone: Beijing    上面的示例描述了两个定时任务:每年10月2日19点执行mycron/test.php;每隔10分钟执行mycron/another_test.php

删除cron

编辑saetest/1/config.yaml,删除某个cron段,config.yaml示例如下:

name: saetest
version: 1
- description: cron test
  url: mycron/test.php
  schedule: $2 day of october 19:00
  timezone: Beijing    上面的示例比上面的例子删除了another cron test

config.yaml示例如下:

    name: saetest
    version: 1    该示例则不包含任何cron任务

语法字段含义

    - description:
    不是必填,默认为空;
 
    - url:
    是cron 需要执行的代码的相对路径,如myapp/1/code/test.php,url则写为test.php
 
    - schedule:
    cron的描述字段,$符号表示第几,$2 表示第二,$13 表示第十三
 
    - timezone:
    不是必填,默认为北京时间;目前时区支持:北京时间、纽约时间、伦敦时间、悉尼时间、莫斯科时间、柏林时间、东京时间和洛杉矶 时间
 
    - login:
    http basic auth设置,不是必填,默认为无特殊权限;kobe@123456,则表示访问用户和密码为kobe和123456(具体页面的权限访问 控制请参考appconfig)
 
    - times:
    表示执行的次数,默认是循环执行(INT_MAX),如果该值大于零,则每执行一次减一,直到等于零,如3则表示执行3次

Cron SAE语法例子

- description: cron test
  url: mycron/test.php
  schedule: every 5 mins
  login: kobe@123456    每隔5分钟运行mycron/test.php,基于中国北京时间,http访问权限为用户名kobe、密码123456
- description: cron test
  url: mycron/test.php
  schedule: every 5 mins, offset 49    每隔5分钟(偏移49秒,也就是第5分钟的49秒,第10分钟的49秒,第15分钟的49秒。。。),运行mycron/test.php,基于中国北京时间
- description: cron test
  url: mycron/test.php
  schedule: every 1 hour, offset 0    每整点运行mycron/test.php(9点整运行,10点整运行,11点整运行,12点整运行。。。),基于中国北京时间
- description: cron test
  url: mycron/test.php
  times: 100
  schedule: every 1 hour    每隔1小时运行mycron/test.php,随机偏移时间,如(9:17:29运行,10:17:29运行,11:17:29运行,12:17:29运行。。。),基于中国北 京时间,一共运行100次
- description: cron test
  url: mycron/test.php
  schedule: every 1 hour, offset 15
  login: kobe@123456    每小时一刻运行mycron/test.php,(9:15:00运行,10:15:00运行,11:15:00运行,12:15:00运行。。。),基于北京时间,http访问权限 为用户名kobe、密码123456
- description: cron test
  url: mycron/test.php
  schedule: every 3 hour
  login: kobe@123456    每隔3小时运行mycron/test.php,随机偏移时间,如9:36:56执行、12:36:56执行、15:36:56执行,基于北京时间,http访问权限 为用 户名kobe、密码123456
- description: cron test
  url: mycron/test.php
  schedule: every day of month 00:20    每天的零点20分执行test.php
- description: cron test
  url: mycron/test.php
  schedule: every monday of march 11:00
  timezone: Beijing    每年3月的每个周一的11:00运行mycron/test.php,基于北京时间
- description: cron test
  url: mycron/test.php
  schedule: every sunday of month 20:10
  timezone: LosAngeles    每月的每个周日的20:10运行mycron/test.php,基于美国洛杉矶时间
- description: cron test
  url: mycron/test.php
  schedule: $2 day of month 19:00
  timezone: Moscow   每月的2号19:00运行mycron/test.php,基于俄罗斯莫斯科时间
- url: index.php
  description: cron.php
  schedule: every 1 hour,offset 32, from 8:00 to 12:00
  times: 2147483647
  timezone: Beijing    每天八点到十二点间每隔一个小时(偏移32分钟)运行一次cron.php
- url: index.php
  description: send.php
  schedule: every day of march 15:50, from 2011.3.2
  times: 2147483647
  timezone: Beijing    从2011.3.2日起三月份每天的15:50运行send.php
- url: index.php
  description: bill.php
  schedule: every 10 mins, from 2011.3.3 8:00 to 2011.3.9 8:00
  times: 2147483647
  timezone: Beijing    从2011.3.3日八点起,至2011.3.9日八点,每隔10分钟运行一次bill.php
 Cron unix crontab语法例子
 
- description: cron test
  url: mycron/test.php
  schedule: */5 * * * *
    每五分钟运行一次 mycron/test.php,基于北京时间
 
- description: cron test
  url: mycron/test.php
  schedule: 5 */2 * * *
每隔两小时运行一次mycron/test.php,基于北京时间。特别注意的 就是分钟位置上一定要制定一个数字,表示在多少分钟运行,如果 不指定,这是间隔一小时后,每分钟运行一次。
 
- description: cron test
  url: mycron/test.php
  schedule: 5 12 * * 4
每个周四的12:05运行一次mycron/test.php,基于北京时间。
 
- description: cron test
  url: mycron/test.php
  schedule: 5 12 4 * *
每个月4号的12:05运行一次mycron/test.php,基于北京时间。
 
- description: cron test
  url: mycron/test.php
  schedule: 5 12 */3 * 4
每隔三天的12:05或者是每隔星期四的12:05运行一次mycron/test.php,基于北京时间。
 
- description: cron test
  url: mycron/test.php
  schedule: 5-20 12-16,20 3,4 3-9 4
条件1:如果今天是今年3-9月中的某一天,并且今天是3、4号的某一天
    条件2:今天是星期四
    条件3:现在的时间小时上的数字(24小时制)是在12-16&&20中的某一个数字
    条件4:现在的时间分钟上的数字是5-20中的某一个数字
    if((条件1 || 条件2) && 条件3 && 条件4)  运行一次mycron/test.php,基于北京时间。

Java调用方式

  Java应用使用Cron的和方法以及配置文件语法和php是相同的(详情可参见Cron服务文档),唯一不同之处在于上传config.yaml的方式。因为Java应用在线只提供war包上传功能,所以上传config.yaml文件只能通过svn上传的方式来实现。
 

以应用名为javatest版本号为1的应用使用cron为例,只需将config.yaml文件加入应用对应版本的SVN路径下javatest/1/config.yaml(和war包路径相同),之后svn commit即可。需要注意的是,cron服务只对应用的默认版本有效。

 

Python调用方式

Cron的配置文件为 config.yaml ,Cron的执行状态可在应用的管理界面 服务管理>Cron 中查看。

·添加Cron:

编辑config.yaml文件中,增加cron段,例如:

name: crontest
version: 1
cron:
- description: cron_test
  url: /cron/make
  schedule: "*/5 * * * *"

上面的示例添加了一个cron任务,该任务每5分钟执行 http://crontest.sinaapp.com/cron/make 一次。

·删除cron:

删除config.yaml中对应的cron描述段即可就行。

·语法字段含义

·url

cron任务的url。例如 /relative/url/to/cron 。

·schedule

任务描述,也就是何时执行这个cron,支持unix crontab语法。例如:

# 每天0005分执行
"5 0 * * *"
# 每月1号的1415分执行
"15 14 1 * *"
# 每个工作日的晚上10点执行
"0 22 * * 1-5"
# 每分钟执行一次
"*/1 * * * *"

具体的语法规则可以参考man手册, man 5 crontab 。

·description

可选。任务的说明,默认为空。

·timezone

可选。默认为Beijing,目前支持:Beijing, NewYork, London, Sydney, Moscow, Berlin

·login

可选。http basic auth设置,格式: 用户名@密码

·times

可选。设置cron最大执行的次数,默认没有次数限制。

Note:

Cron使用GET方式请求URL。

Cron完整示例

每五分钟请求一次/backend/cron/update URL

Flask URL 处理程序:

importpylibmc
importdatetime

fromappstackimportapp

mc=pylibmc.Client(['localhost'])

@app.route('/backend/cron/update',methods=['GET','POST'])
defupdate():
    update_time =mc.get('update_time')
    mc.set("update_time",str(datetime.datetime.now()))

    returnupdate_time

config.yaml:

 name: appstack
 version: 4

 cron:
 - url: /backend/cron/update
    schedule: "*/5 * * * *"