SQSJobQueueBundleについて

SQSJobQueueBundleについて

December 2, 2015,
tags: php symfony


このエントリーをはてなブックマークに追加

Symfony Advent Calendar 2015 二日目の記事です。
http://qiita.com/advent-calendar/2015/symfony

前日の記事: DoctrineでSQLの日付関数を使う方法  


皆さんご存知だとは思いますが、SQSJobQueueBundleを今年作りました。
SQSJobQueueBundleとは、AmazonSQSを利用したJobQueueライブラリです。

処理の流れとしては、以下の様なイメージです。

  1. SymfonyアプリケーションがJobを生成し、Queueに渡す
  2. QueueがAmazonSQSにJobを登録
  3. WorkerがQueueを使ってJobを取得
  4. WorkerがJobを実行する

実際にSymfony2で使ってみる

流れとしては以下のとおりです。

  • composerでインストール
  • AppKernelに登録
  • config.ymlの設定
  • メール送信用のJobを用意する
  • JobをQueueに登録する
  • 登録したキューを実行する

composerでインストール

まずはcomopserでSQSJobQueueBundleを登録します。

$ composer require tavii/sqs-job-queue-bundle

AppKernelに登録

AppKernelに登録しましょう。

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new Tavii\SQSJobQueueBunblde\SQSJobQueueBundle()
        );

        // ...
    }

    // ...
}

config.ymlの設定

config.ymlに追加を追記します。
AWSの設定とprefixを指定します。prefixを指定しないと、複数のアプリケーションで同じSQSを利用した場合に判別できなくなってしまいますので、application名+実行環境名みたいな形でprefix指定する事をおすすめします。

tavii_sqs_job_queue:
    prefix: testapp_dev
    aws:
        key: %aws_api_key%
        secret: %aws_api_secret%
        region: %aws_api_region%

メール送信用のJobを用意する

次にジョブを作ります。 どこのディレクトリに配置してもいいんですが、とりあえず今回はAppBundle\Jobに配置します。

<?php
// src/AppBundle/Job/SendMailJob.php

namespace AppBundle\Job;


use Tavii\SQSJobQueueBundle\ContainerAwareJob;

class SendMailJob extends ContainerAwareJob
{
    protected $name = "send_mail";

    public function run()
    {
        $message = \Swift_Message::newInstance()
            ->setFrom('hoge@fuga.com')
            ->setTo($this->args['to'])
            ->setSubject('job test')
            ->setBody('job mail test');

        $mailer = $this->getContainer()->get('mailer');
        $ret = $mailer->send($message);
        return true;
    }
}

Job::run()の処理が成功の場合はtrueを返してください。 失敗した場合は、falseを返すようにしてください。

JobをQueueに登録する

Jobを登録します。
実行時に必要な動的なデータはここで定義します。

<?php
...

$job = new SendMailJob([
  'to' => 'polidogs@gmail.com'
]);
$this->getContainer()->get('sqs_job_queue.queue')->push($job);

登録したキューを実行する

SendMailJobクラスを作った際にprotected $name = "send_mail"と指定したので、send_mailを指定してWorkerを実行します。

$ app/console sqs_job_queue:worker-run send_mail

実際運用出来ているの?

実際に4ヶ月ほど運用していますが特にトラブルもなく、今のところは運用出来ています。
一部Workerの処理に問題がありますが、近いうちに修正する予定です。

今後修正する箇所

  • workerの実装を全面的に見直す
  • workerのwebページ作成
  • ContainerAwareJobの見直し

などを予定しています。 もし何かあるようでしたらぜひgithubのissueをお願いします。

作ることによって、Symfony2をより理解できた

Symfony2を使ってwebアプリケーションを作っていましたが、Bundleを作るのは初めてでした。 なかなか良い経験が出来ました。

普段はBundleを使う側だったので気づかなかったけれど、SymfonyのBundleを作ると気づく事がたくさんあります。

何かのライブラリをSymfony2で使うためのBundleを作ると、ライブラリの設計についても学べると思います。
インターフェースの使い方なんかも勉強になると思います。

また、他のBundleの実装が気になってBundleの実装コードを読むようになります。
そこで気づく事がたくさんあると思うし、その後Symfony2を使ったアプリケーションを開発する際に必ず役立ちます。

Symfony2でアプリを作ってみたあとは、ぜひBundle作りにチャレンジしてみてはいかがでしょうか?

最後に

AWS環境でメッセージ・キューを利用したい場合は、ぜひSQSJobQueueBundleを使ってみてください。


明日12/2は@karakaramさんの記事です!

comments powered by Disqus