原文是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的语法形式如下:
第三方工具
第三方开发的生成Cron的小工具 http://saetools.sinaapp.com/cron.html
PHP调用方式
使用指南
例子:
Cron最新支持unix的crontab语法,可以同时在分钟、小时、天、月和星期位置上进行各种组合设置,时间设置的精度为分钟,方便习 惯于写crontab的系统管理员使用。
增加Cron
编辑saetest/1/config.yaml,增加cron段,config.yaml示例如下:
删除cron
编辑saetest/1/config.yaml,删除某个cron段,config.yaml示例如下:
config.yaml示例如下:
语法字段含义
Cron SAE语法例子
Java调用方式
以应用名为javatest版本号为1的应用使用cron为例,只需将config.yaml文件加入应用对应版本的SVN路径下javatest/1/config.yaml(和war包路径相同),之后svn commit即可。需要注意的是,cron服务只对应用的默认版本有效。
Python调用方式
Cron的配置文件为 config.yaml ,Cron的执行状态可在应用的管理界面 服务管理>Cron 中查看。
·添加Cron:
编辑config.yaml文件中,增加cron段,例如:
上面的示例添加了一个cron任务,该任务每5分钟执行 http://crontest.sinaapp.com/cron/make 一次。
·删除cron:
删除config.yaml中对应的cron描述段即可就行。
·语法字段含义
·url
cron任务的url。例如 /relative/url/to/cron 。
·schedule
任务描述,也就是何时执行这个cron,支持unix crontab语法。例如:
# 每天00:05分执行
"5 0 * * *"
# 每月1号的14:15分执行
"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: