Ubuntu 16.04でBeanstalkとSupervisorを使用してLaravelワークキューを管理する

Beanstalkは高速でシンプルな作業キューです。メールの送信、外部APIへの接続、画像の処理など、時間のかかるタスクを非同期で実行できます。そうすることで、Webアプリのレイテンシを削減できます。Laravelは、の標準サポートを提供しますbeanstalkd

このチュートリアルではbeanstalkd、Laravelアプリケーションのインストールとセットアップを行い、Supervisorを介してキューワーカーを管理します。デモアプリケーションは、Vultr APIから利用可能なOSのリストを取得し、ランダムに選択します。

システムにスーパーバイザがすでにインストールされていることを前提としています。そうでない場合は、スーパーバイザのセットアップ方法に関する次のチュートリアルを読む必要があります。Ubuntu 16.04でのスーパーバイザのインス​​トールと構成

また、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サーバーの単なるクライアントであり、互いに完全に独立していることに注意してください。実際には、これは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を使用するには、もう1つの依存関係である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からデータをフェッチし、OSをランダムに選択して、選択したOSをログファイルに書き込みます。ログファイルはにありますstorage/logs/laravel.log

Beanstalkはすでにインストールされており、それによって実行されるジョブが定義されています。次に、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

スーパーバイザ構成ファイルを配置する正しいパスは、セットアップによって異なることに注意してください。また、システムの[PROJECT_ROOT]への絶対パスに置き換えることを忘れないPROJECT_ROOTでください。

ここでは、キューの処理を自動的に開始し、スクリプトが壊れた場合は再起動するようにスーパーバイザを構成しています。また、1つのワーカーではなく8つのプロセスをインスタンス化していることにも注意してください。アプリケーションによっては、必要に応じて多くのプロセスをインスタンス化できます。

スーパーバイザがワーカーを管理できるようにするには、強制的にその構成を再度読み取らせます。

sudo supervisorctl reread
sudo supervisorctl update

スーパーバイザサービスが開始されていない場合、多くの場合、開始する必要があります。

sudo systemctl start supervisord

次に、ジョブが処理されているかどうかを確認します。

tail -f storage/logs/laravel.log

Webブラウザーで、に移動しhttp://[vultr-instance-ip]:8000ます。コンソールで生成されているログが表示されます。

結論

Beanstalkをワークキューとして使用するようにLaravelアプリケーションを設定しました。また、スーパーバイザーを使用してワーカーを管理する方法も示しました。



Leave a Comment

CentOS 7にApacheをインストールする方法

CentOS 7にApacheをインストールする方法

CentOS 7サーバーにApache 2.4をインストールする方法を説明します。安定したウェブサーバーを構築するための前提条件と手順を解説します。

FreeBSD 11.1にBlacklistdをインストールする方法

FreeBSD 11.1にBlacklistdをインストールする方法

FreeBSD 11.1におけるBlacklistdのインストール方法について詳しく解説します。この方法を通じて、強力なセキュリティ対策を実装できます。

Windows Serverのサーバーマネージャーを使用した複数サーバーの管理

Windows Serverのサーバーマネージャーを使用した複数サーバーの管理

サーバーマネージャーを使用して、Windows Serverの管理が向上します。セキュリティリスクを軽減し、効率的な管理を実現します。

CentOS 7にSeafileサーバーをインストールする方法

CentOS 7にSeafileサーバーをインストールする方法

CentOS 7にSeafileサーバーをインストールする方法。Seafile(コミュニティバージョン)は、ownCloudに似た無料のオープンソースファイル同期および共有ソリューションです。

DebianでSnortを設定する方法

DebianでSnortを設定する方法

Snortは無料のネットワーク侵入検知システムです。最新の方法で、SnortをDebianにインストールし、設定する手順を紹介します。ネットワークのセキュリティを強化しましょう。

CentOS 7にGraylogサーバーをインストールする方法

CentOS 7にGraylogサーバーをインストールする方法

CentOS 7にGraylogサーバーをインストールし、ログ管理を行う方法を学びます。

WindowsでhMailServerを使用してメールサーバーを構築する

WindowsでhMailServerを使用してメールサーバーを構築する

WindowsサーバーでWebサイトを実行している場合、電子メールも受信できるようにするためにhMailServerを使用する方法を解説します。

Ubuntu 19.04にFiveMサーバーをインストールする方法

Ubuntu 19.04にFiveMサーバーをインストールする方法

FiveMサーバーをUbuntu 19.04にインストールするための詳細なガイド。必要条件からインストール、起動、トラブルシューティングまで、すべてのステップを含みます。

WsgiDAVを使用してDebian 10にWebDAVをデプロイする

WsgiDAVを使用してDebian 10にWebDAVをデプロイする

Debian 10にWebDAVをデプロイする方法を学び、WsgiDAVとSSL証明書で安全な接続を実現しましょう。

ヘルスケア2021における人工知能の影響

ヘルスケア2021における人工知能の影響

ヘルスケアにおけるAIは、過去数十年から大きな飛躍を遂げました。したがって、ヘルスケアにおけるAIの未来は、日々成長を続けています。