ServiceでSESとSQSを使って、大量に高速に送ることが出来るメールマガジン配信システムを構築してみました。別の開発者の人が開発していたものを、引き継いで受託していたサービスが、日々会員数が増えるたびにメールの配信時間が伸びていき、最終的に2万人に配信するのに6時間ほどかかるシステムになっていました。システムシステム構成はシンプルでAWSのEC2のインスタンス上でDBやアプリケーションが動いており、画像などのリソースの保存にS3を、メール送信にSESを使っています。ちなみにアプリケーションはJavaEEです。最近ではちょっと珍しい?ですね。問題点もともとのシステムは、管理画面から登録されたメルマガ情報からメルマガを受診する対象のユーザーを取得し、名前などを埋め込んだスプールを作成する「スプール生成バッチ」と、DBに登録されたスプールを順番に送信する「スプール送信バッチ」が存在しました。スプールの送信が追いつかない場合はバッチが複数呼び出されるようになっています。このシステムが設計されたのは、会員数の少ない頃では耐え抜いてきましたが、次第に会員数が増えると全体の送信に要する時間が増えてきました。原因を探ると、スプール送信バッチが複数呼び出されて同じメールを複数送信しないようDBをロックしていたことが問題でした。図にすると以下の感じです。解決策ここで、求められる要件は以下の3つ。Service)です。シンプルなキューイングサービスですが、自分で構築するよりもメリットが多く、以下の様な特徴があります。信頼性が高い低コスト分散マネージドキュースケーラビリティに優れているSQSについては以下のスライドで詳しく解説されています。SQSを使ったシステムを図にすると以下の感じです。SQSを使うことで、バッチが同時に動いていても、スプール生成バッチでスプールをキューイングし、スプール送信バッチでキューからスプールを取得しメールを送信することが出来るようになります。SQSの機能SQSのQueueの作成方法などはいろんなページで紹介されてるので割愛します。SQSの機能はQueueの設定画面から詳細な設定をすることが出来ますが、そのうちいくつかを紹介します。TimeoutはSQSで一番の肝となる機能です。Timeoutで指定されている時間はそのキューを送信することはありません。Timeoutで指定されている時間を過ぎた場合また、同じキューを送信してしまいます。Timeoutではキューの処理にかかる時間より多めの時間をセットしておくことで、キューの処理に失敗した場合に、またそのキューを処理することが出来ます。Delayを設定することにより、SQSにキューが登録されてからキューの対象になるまで間隔を開けることが出来ます。Queueを設定することにより、n回以上取り残されたキューを別のQueueに移動することが出来ます。移動されたキューに対してもう一度バッチを回したり原因究明に使ったりすることが可能です。以下、SystemConfigやMailSpoolなどのクラスが登場しますが、雰囲気で察してください。汎用クラスAWSのサービスを使う際にいちいち認証周りを基にしなくてもいいよう、AmazonSQSClientを提供してくれる汎用的なクラスを作っておきます。}}スプールをキューイングメールのデータとなるスプールをSQSにキューイングします。Attributesがあります。AttributesはString、Number、Binaryなど特定の型のデータを埋め込むことが出来ます。埋め込めるデータは全部で256KB以内です。SendMessageRequest().withQueueUrl(queueUrl).withMessageBody("mailSpool").withMessageAttributes(attributes));}キューからスプールを送信SQSからキューを取り出し、スプールを送信します。Attributesを返してきません。そのため、明示的に指定する必要があります。これが一番の肝ですがSQSのシステムは最低一度のメッセージ到達を保証です。いうことは、一度以上同じキューが配信される場合があります。そのため、システム側で同じキューを処理したかのチェックが必要となります。count;}まとめこの仕組みで、約1万件を10分くらいで処理することが出来ました。チューニングすればもう少し速く送信することが出来ると思います。AWSのシステムを組み合わせてどんどんアプリケーションを作りこむことができるので、AWSは面白いですね。ちなみに、コスト面ですが最初の100万件までは無料で、それ以降、100万件につき$0.50ということで、この規模であればタダで使う事が出来ました。詳しい使い方や仕様については、公式ドキュメントをご覧ください。ツイート筆者プロフィールみゆっきセキュリティ、ストリーミングなどに興味があるWeb兼なんでも屋さん。スーパークリエータとして認定されたり。LiveWedgeを開封してしばらく使ってみた2015/01/29プロ生を支える生放送配信機材たち。