我对使用队列进行密集型处理感到陌生。我有一个应用程序,它将上传一个短视频,使用FFMPEG处理它,然后使用他们的API上传到youtube,然后与我的数据库进行交互。我的问题:
我应该使用两个不同的队列吗?一个要处理,然后将其交给另一个队列上传?或者我应该将所有处理工作放在一个工人身上吗?
是否可以与工作人员进行数据库交互,还是应该以其他方式执行此操作?
答案 0 :(得分:0)
我建议使用两个不同的队列,一个用于图像处理,另一个用于将其上传到youtube。从队列工作者查询数据库是完全可以的,尽管您可以传递消息中的所有必需数据,因此您不需要数据库。
以下是使用enqueue库实现此类功能的方法。
您必须安装enqueue/simple-client
库和one of the transports。假设你选择了一个文件系统,那么让我们安装它:
composer require enqueue/simple-client enqueue/fs
现在让我们看看如何从POST脚本发送消息:
<?php
// producer.php
use Enqueue\SimpleClient\SimpleClient;
include __DIR__.'/vendor/autoload.php';
$client = new SimpleClient('file://'); // the queue will store messages in tmp folder
// you uploaded the file to your server,
// and now you have a path to the file.
// I assume it is in the $movieFile var.
$client->sendCommand('process_movie', $movieFile);
消费脚本:
<?php
// consumer.php
use Enqueue\Client\Config;
use Enqueue\SimpleClient\SimpleClient;
use Enqueue\Psr\PsrProcessor;
use Enqueue\Psr\PsrMessage;
include __DIR__.'/vendor/autoload.php';
$client = new SimpleClient('file://');
$client->bind(Config::COMMAND_TOPIC, 'process_movie', function(PsrMessage $psrMessage) use ($client) {
$movieFile = $psrMessage->getBody();
// a movie processing logic here
// once we have done with processing we can send a message to upload_movie queue.
$client->sendCommand('upload_movie', $movieFile);
return PsrProcessor::ACK;
});
$client->bind(Config::COMMAND_TOPIC, 'upload_movie', function(PsrMessage $psrMessage) {
$movieFile = $psrMessage->getBody();
// a movie uploading logic here
return PsrProcessor::ACK;
});
// this call is optional but it worth to mention it.
// it configures a broker, for example it can create queues and excanges on RabbitMQ side.
$client->setupBroker();
$client->consume();
使用supervisord或其他进程管理器运行尽可能多的consumer.php
进程,在本地计算机上运行它,无需任何额外的库或包。
这是一个基本的例子,入队有许多其他可能派上用场的功能。如果您有兴趣,请查看enqueue documentation。