Symfony和Heroku worker:我可以使用数据库作为前端和后台工作者之间的通信机制吗?

时间:2016-11-25 01:40:54

标签: php heroku background-process

我需要Heroku's Worker来执行一些后台任务。

现在,在PHP 中阅读文章后台工作与工作人员,我发现the architecture designed in the article makes use of RabbitMQ为web dyno和worker dyno之间的消息传递系统。

但是我不想使用RabbitMQ,因为它在这个阶段实在太复杂了。

因此,作为web dynoworker dyno之间的沟通机制,我想使用以下两种选择之一:

  1. 只是数据库(很大程度上是我最好的选择:P)
  2. AWS SQS(我可以使用它,但数据库会更好地满足我的需求)
  3. 现在,提供的示例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可能是最终的解决方案吗?它会不停地运行吗?

1 个答案:

答案 0 :(得分:0)

如果您正在使用Heroku PostgreSQL(例如),您可以让您的工作进程监听asynchronous notifications,您可以通过创建适当的触发器来自数据库。

有关详细信息,请参阅this nice post on Postgres Pub-Sub features

因此,您的网络动态可以在数据库中插入或更新记录,这些记录可以自动触发对工作人员动态的通知。

您的工作人员dyno会永远运行,只需侦听通知通道,处理收到的任何消息。

如果您使用的是其他数据库,则可能有也可能没有类似的功能。但使用Postgres绝对可行(事实上非常简单)。