在Ubuntu 16.04上使用Beanstalk和Supervisor管理Laravel工作队列

Beanstalk是一个快速简单的工作队列。它允许您异步运行耗时的任务,例如发送电子邮件,连接到外部API或处理图像。这样,您将减少Web应用程序的延迟。Laravel为提供了开箱即用的支持beanstalkd

在本教程中,我们将安装beanstalkd,设置演示Laravel应用程序并通过Supervisor管理队列工作器。该演示应用程序将从Vultr API获取可用操作系统列表,并随机选择一个。

假定您已经在系统上安装了Supervisor。如果不这样做,则应阅读以下有关如何设置Supervisor的教程:在Ubuntu 16.04上安装和配置Supervisor

还假定您具有对Vultr实例的SSH访问权限。

安装Beanstalk

第一步是安装beanstalkd

sudo apt-get update
sudo apt-get install beanstalkd

启动服务。

sudo systemctl start beanstalkd

您还可以使服务在系统初始化时启动。

sudo systemctl enable beanstalkd

发出以下命令,检查服务状态。

sudo systemctl status beanstalkd

默认情况下,beanstalkd侦听端口11300。Beanstalk使用github存储库中描述的基于文本的简单协议。您可以通过运行来测试其协议telnet

telnet localhost 11300

写以下内容并点击ENTER

list-tubes

您应该看到服务器上可用管的列表:

OK 14
---
- default

要关闭连接,只需键入quit,然后按ENTER

Beanstalk中的管道代表工作队列。豆茎基本上由生产者消费者工作管子组成。生产者将作业放入管中,以供任何数量的消费者消费(加工)。请注意,生产者和使用者都只是Beanstalk服务器的客户端,并且彼此完全独立。实际上,这意味着通过使用Beanstalk,您可以在PHP应用程序中生产作业,并在NodeJS应用程序中对其进行处理。幸运的是,Laravel对所有这些进行了抽象,并为我们提供了一个非常简单的API来调度和处理作业,我们将在接下来看到。

样例项目

要构建示例项目,我们首先需要安装其依赖项。我们将安装PHP和Composer。

sudo apt-get install php php-mbstring php-xml php-common php-zip composer

现在,基于Laravel 5.5创建项目。

composer create-project --prefer-dist laravel/laravel vultr "5.5.*"

接下来cd进入最近创建的文件夹。从现在开始,我们将在此目录中工作。以后可以将该文件夹引用为PROJECT_ROOT

cd vultr/

要在Laravel中使用Beanstalk,我们需要再安装一个依赖项,即PHP Beanstalk客户端。

composer require pda/pheanstalk ~3.0

我们还需要创建一个Job表示。在Laravel中,这是app/Jobs文件夹内的类。Laravel有一个控制台命令来帮助我们创建Job类。让我们创建示例作业。

php artisan make:job FindFavoriteOS

app/Jobs/FindFavoriteOS.php文件更新为以下内容。

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;

class FindFavoriteOS implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $rawData = file_get_contents('https://api.vultr.com/v1/os/list');
        $list = json_decode($rawData, true);
        shuffle($list);
        $key = array_rand($list);
        $favorite = $list[$key];
        Log::info('My Favorite OS is: ' . $favorite['name']);
    }
}

handle方法是消耗作业时将有效执行的方法。在这里,我们从Vultr API中获取数据,随机选择一个操作系统并将所选的操作系统写入日志文件。日志文件位于storage/logs/laravel.log

我们已经安装了Beanstalk并定义了要由它执行的Job。现在是时候告诉Laravel使用Beanstalk作为默认工作队列了。复制.envLaravel安装提供的默认文件。

cp .env.example .env

现在打开.env文件并更新指定队列驱动程序的行。

QUEUE_DRIVER=beanstalkd

最后,生成一个应用程序密钥。

php artisan key:generate

现在,我们准备将作业调度到Beanstalk工作队列。

调度和运行作业

在Laravel中分配工作非常简单。更新routes/web.php文件。

<?php

Route::get('/', function () {
    for ($i = 0; $i < 50; $i++) {
        \App\Jobs\FindFavoriteOS::dispatch();
    }

    return '50 Jobs dispatched!';
});

尽管不建议在生产环境中运行内置的提供的服务器,但为简洁起见,我们将在这里使用它。

php artisan serve --host 0.0.0.0 --port 8000

现在,在Web浏览器中,导航到http://[vultr-instance-ip]:8000。您将看到以下消息。

50 Jobs dispatched!

打开到服务器的新SSH连接,并在我们的项目根目录内,执行以下操作。

php artisan queue:work --once

这是预期的输出:

[2018-02-14 00:03:52] Processing: App\Jobs\FindFavoriteOS
[2018-02-14 00:03:53] Processed:  App\Jobs\FindFavoriteOS

确认已生成日志。

cat storage/logs/laravel.log

配置主管

为避免需要手动处理队列,我们​​将使用supervisord。在中创建以下程序配置/etc/supervisor/conf.d/vultr.conf

[program:vultr]
process_name=%(program_name)s_%(process_num)02d
command=php [PROJECT_ROOT]/artisan queue:work
autostart=true
autorestart=true
numprocs=8
redirect_stderr=true
stdout_logfile=/var/log/worker.log

请注意,放置Supervisor配置文件的正确路径将取决于您的设置。另外,请记住用系统[PROJECT_ROOT]上的完整路径替换PROJECT_ROOT

在这里,我们将Supervisor配置为自动开始处理队列,并在脚本中断的情况下重新启动它。另请注意,我们不是实例化单个工作程序,而是实例化8个进程。您可以随意实例化任何所需的过程,具体取决于您的应用程序。

为了允许Supervisor管理我们的工作人员,强制其重新读取其配置。

sudo supervisorctl reread
sudo supervisorctl update

如果尚未启动Supervisor服务,则许多人都需要启动它。

sudo systemctl start supervisord

现在,让我们看看作业是否正在处理中。

tail -f storage/logs/laravel.log

在网络浏览器上,浏览至http://[vultr-instance-ip]:8000。您将在控制台上看到正在生成的日志。

结论

我们已经成功配置了Laravel应用程序以将Beanstalk用作工作队列。此外,我们还演示了如何使用Supervisor管理工作人员。



Leave a Comment

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。