我需要Heroku's Worker来执行一些后台任务。
现在,在PHP 中阅读文章后台工作与工作人员,我发现the architecture designed in the article makes use of RabbitMQ为web dyno和worker dyno之间的消息传递系统。
但是我不想使用RabbitMQ,因为它在这个阶段实在太复杂了。
因此,作为web dyno
和worker dyno
之间的沟通机制,我想使用以下两种选择之一:
现在,提供的示例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队列?
我应该使用启动dyno的Heroku Scheduler来使用预定作业吗?(不适用:请参阅here为什么)。
或者我还没有考虑另一种流程?
或者更重要的是,根据前端应用创建symfony command line app可能是最终的解决方案吗?它会不停地运行吗?
答案 0 :(得分:0)
如果您正在使用Heroku PostgreSQL(例如),您可以让您的工作进程监听asynchronous notifications,您可以通过创建适当的触发器来自数据库。
有关详细信息,请参阅this nice post on Postgres Pub-Sub features。
因此,您的网络动态可以在数据库中插入或更新记录,这些记录可以自动触发对工作人员动态的通知。
您的工作人员dyno会永远运行,只需侦听通知通道,处理收到的任何消息。
如果您使用的是其他数据库,则可能有也可能没有类似的功能。但使用Postgres绝对可行(事实上非常简单)。