【Symfony】Messagerについて

こんにちわ、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アプリケーションに非同期処理やメッセージキューを簡単に導入する方法を書きました。

ご覧いただきありがとうございます。