作者:BeckyWang25_966 | 来源:互联网 | 2014-04-02 18:02
//SAE需要手动建立一个test,然后通过如下代码调用使用
$t = new SaeTaskQueue("test");
$t->addTask("http://" . $_SERVER['HTTP_HOST'] . __URL__ . "/tq_test1"); //添加列队任务1
$t->addTask("http://" . $_SERVER['HTTP_HOST'] . __URL__ . "/tq_test2", "k1=v1&k2=v2", true); //添加列队任务2
if (!$t->push()) {
echo '出错:' . $t->errmsg();
} else {
echo '执行成功!请查看[' . LOG_PATH . 'sae_debug.log' . ']文件中的日志';
}
//列队任务1
public function tq_test1() {
sae_debug("列队任务1被执行");
}
//列队任务2
public function tq_test2() {
sae_debug("列队任务2被执行,k1的值:{$_POST['k1']},k2的值:{$_POST['k2']}");
}
?>
后附SAE的TaskQueue介绍---------------
TaskQueue 是SAE为开发者提供的分布式任务队列服务,用来以异步HTTP方式执行用户任务。用户需要先在在线管理平台创建Queue,然后向Queue Push任务,放入队列的任务随即即会执行。TaskQueue 的任务的执行是以HTTP方式执行的,真正执行的是用户在App中的PHP代码,所以最长执行时间和HTTP页面执行时间相同。TaskQueue 服务是分布式环境部署的,具有高可靠性,每个worker相互隔离,并且主动负责任务执行。
Queue分为顺序队列和并发队列,顺序队列的任务顺序执行,而并发队列中的任务则以并行的方式执行。用户还可以为每个Queue指定error callback url,当每个任务执行失败时,TaskQueue 自动会调用error callback url通知开发者。
特别注意:
-
TaskQueue 的任务的最长时间不得超过30秒
-
并发队列不保证任务的有序性
-
所有队列类型都有最大长度,请勿使队列长期阻塞
-
所有APP创建TaskQueue 总数<=10
应用场景
TaskQueue 服务主要提供针对http方式的异步任务执行,如开发者想给1000个用户发送微博,如果写成:
for($i=0;$i<1000;$i++)
send_weibo();
很容易造成页面超时,因为发送任务均为同步执行。而如果使用TaskQueue 则不会超时,如写成:
$array=array();
for($i=0;$i<1000;$i++)
$array[]=array('url'=>"http://freedemo.sinaapp.com/sendweibo.php", "postdata"=>user[$i]);
$queue->addTask($array);
使用指南
例子:
appname: saetest
appversion: 1
创建queue
使用TaskQueue 服务执行,开发者需要登录在线管理平台,并进入服务管理=>TaskQueue ,先创建队列。TaskQueue 目前的队列分成两大类,顺序队列和并发队列:
一些概念:
-
顺序队列:并发度为1,以保证任务可以按照进入队列的先后顺序依次执行
-
并发队列:并发度>1,进入队列的任务将按并发度并行执行,不保证严格有序
-
并发度:负责处理该队列的worker数量,worker越多处理的越快
-
worker:负责处理任务,并执行Web请求
-
最大长度:当队列worker处理较慢,队列发生阻塞时,允许队列的最大长度,当队列达到最大长度时,新的任务将不能进入队列,直到有旧任务从队列中消费出去为止
-
任务:TaskQueue 目前只支持web任务,任务的执行可以用GET或者POST方式,用户负责对格式做拼装和解析
-
队列属性还有一个“失败回调URL”,指的是:当该任务执行失败时,回调的URL地址,如果用户制定了该地址,SAE会将原请求的 url上增加原请求地址后原封不动再发送给回调URL,如:用户原HTTP请求(GET):http://kobe.sinaapp.com /a.php,用户指定了失败回调URL:http://kobe.sinaapp.com/error_callback.php,则当TaskQueue 失败时得到的回调是:http://kobe.sinaapp.com/error_callback.php?url=http://kobe.sinaapp.com/a.php ,如果原请求为POST方式,则post段内容不变。
用户可以根据自身的需要创建不同属性的队列,如果对顺序性要求强烈,可以选择顺序队列,如果对处理速度要求强烈,可以选择并发大的并发队列;如果任务执行较慢,可能发生拥堵,则最好选择队列最大长度较大的队列。
使用队列
创建完队列后,就可以通过SAE std lib通过函数调用TaskQueue 了,如:
$queue = new SaeTaskQueue('test');//此处的test队列需要在在线管理平台事先建好
//添加单个任务
$queue->addTask("http://freedemo.sinaapp.com/yourtask1.php");
$queue->addTask("http://freedemo.sinaapp.com/yourtask2.php", "postdata", true);
//批量添加任务
$array = array();
$array[] = array('url'=>"http://freedemo.sinaapp.com/yourtask1.php", "postdata"=>"act=test");
$array[] = array('url'=>"http://freedemo.sinaapp.com/yourtask2.php", "postdata"=>"act=test", "prior"=>true);
$queue->addTask($array);
//将任务推入队列
$ret = $queue->push();
var_dump($ret);
服务限制与配额
SAE设置服务限制和配额的目的是为了防止个别用户攻击和滥用,从而在公有云计算平台上保证绝大多数开发者的正常使用。
1. 服务限制和配额设定是在门户网站新浪自身长期运维的基础上经过严格计算得出的,所以正常使用一般不会出现问题。经过SAE实际统计,99%的应用不会受到任何影响
2. 当您发现您的某项服务超过限制或者超配时,请先阅读相关文档确认限制和配额的具体数值,再检查自己的程序是否存在使用不当的情况,如果仍然解决不了,可以和SAE官方联系,saeadmin@sina.cn
服务限制
单任务超时限制
|
300秒
|
单用户创建的最大队列数
|
10
|
注意:由于TaskQueue 服务是回调HTTP服务,所以会受到Runtime内核的限制 。
分钟配额
服务
|
请求数
|
cpu时间
|
流入带宽
|
流出带宽
|
TaskQueue
|
20,000=>40,000
|
60s=>100s
|
10MB=>20M
|
10MB=>20M
|