【发布时间】:2016-11-25 19:12:32
【问题描述】:
我需要一个Heroku's Worker 来执行一些后台任务。
现在,阅读文章PHP 中的worker 后台工作,我发现the architecture designed in the article makes use of RabbitMQ 是web dyno 和worker dyno 之间的消息传递系统。
但我不想使用 RabbitMQ,因为现阶段它真的太复杂了。
因此,作为web dyno 和worker dyno 之间的通信机制,我想使用以下两种选择之一:
- 简单的数据库(主要是我的最佳选择:P)
- AWS SQS(我可以使用,但数据库更适合我的需求)
现在,using RabbitMQ 提供的示例使用回调使脚本处于活动状态并不断接收队列中的新消息:
$callback = function($msg) use($app) {
$app['monolog']->debug('New task received for censoring message: ' . $msg->body);
try {
// call the "censor" API and pass it the text to clean up
$result = $app['guzzle']->get('censor', ['query' => ['corpus' => $msg->body]]);
$result = json_decode($result->getBody());
if($result) {
$app['monolog']->debug('Censored message result is: ' . $result->censored_text);
// store in Redis
$app['predis']->lpush('opinions', $result->censored_text);
// mark as delivered in RabbitMQ
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
} else {
$app['monolog']->warning('Failed to decode JSON, will retry later');
}
} catch(Exception $e) {
$app['monolog']->warning('Failed to call API, will retry later');
}
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
// loop over incoming messages
while(count($channel->callbacks)) {
$channel->wait();
}
我的问题是:如何在不使用 RabbitMQ 的情况下“模拟”$channel->wait() 命令?
换句话说,我怎样才能让worker dyno 能够从数据库或 AWS SQS 中读取队列,持续地开始处理出现在数据库或 AWS SQS 队列中的消息?
我是否应该使用使用 Heroku Scheduler 的计划作业来启动测功机?(不适用:请参阅 here 为什么)。
或者还有其他我没有考虑的流程?
或者,更多,也许创建一个基于前端应用程序的symfony command line app 是最终的解决方案?它会不停地运行吗?
【问题讨论】:
-
我认为你必须使用 Symfony 命令行应用程序,你可以在 Heroku 中像 ruby 脚本一样定义它:devcenter.heroku.com/articles/scheduler#defining-tasks
-
为什么使用“AWS SQS 队列”?
-
为什么不呢?无论如何,因为我已经在使用其他 AWS 服务...
-
无论如何我已经在使用调度程序:这里的问题是我想要一个几乎实时监听的后台进程,就像提供的示例中的工作人员一样赫罗库。但问题是该示例使用了 RabbitMQ。
-
监听数据库或向另一个服务发出请求?
标签: php heroku background-process