こんにちわ、masumasuです。
7月に入り、毎日うだるような暑さですが、皆様体調を崩されないようお気をつけください。
今回は、SymfonyのMessengerコンポーネントで非同期処理とキューを導入する方法を備忘録として残していきます。
Messengerとは?
Messengerは、メッセージ(コマンドやイベント)をオブジェクトとして表現し、それを処理するハンドラに委ねる仕組みです。
同期処理はもちろん、非同期・分散処理にも対応しています。
このコンポーネントは、いわゆる Command Bus / Message Bus パターンに基づいており、コードの責務を明確に分離することができます。
導入方法
まずはMessengerのインストールから始めましょう:
composer require symfony/messenger
次に、送信したい「メッセージ」と、それを処理する「ハンドラ」を作成します。
// src/Message/SendNotification.php
class SendNotification
{
public function __construct(
public readonly string $email,
public readonly string $message
) {}
}
// src/MessageHandler/SendNotificationHandler.php
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
class SendNotificationHandler implements MessageHandlerInterface
{
public function __invoke(SendNotification $message)
{
// 時間のかかる処理(例:メール送信)
sleep(3);
// 実際にはMailerなどを使って送信処理を書く
}
}
これでメッセージを送信する準備が整いました。
非同期化とキュー設定
非同期処理を行うには、まず .env
にキュー(例:Doctrine Transport)を設定します。
MESSENGER_TRANSPORT_DSN=doctrine://default
次に、messenger.yaml
に非同期キューを紐付けます。
# config/packages/messenger.yaml
framework:
messenger:
transports:
async: '%env(MESSENGER_TRANSPORT_DSN)%'
routing:
'App\Message\SendNotification': async
この設定により、SendNotification
メッセージは async
キューに送られ、バックグラウンドで処理されるようになります。
キューの処理を実行する
非同期メッセージはキューに溜まるだけで、自動的には処理されません。
次のコマンドでワーカーを起動し、処理を実行します。
php bin/console messenger:consume async
まとめ
今回は、SymfonyのMessengerコンポーネントを使って、Symfonyアプリケーションに非同期処理やメッセージキューを簡単に導入する方法を書きました。
ご覧いただきありがとうございます。