Perl Hackers Hub

第10回 ジョブキューで後回し大作戦―TheSchwartz,Qudo,Q4M(1)

この記事を読むのに必要な時間:およそ 2.5 分

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはnekokakさんこと小林篤さんで,テーマは「ジョブキューで後回し大作戦」です。

ジョブキューとは

一時代前は時間のかかる処理もすべてWebアプリケーションで行っていましたが,最近ではいろいろな部分で処理の非同期化が行われるようになってきました。たとえばWebのインタフェース側ではAjaxがその最たるものでしょう。アプリケーションのバックグラウンド側でも今回のテーマであるジョブキューと呼ばれるしくみが多く利用されるようになりました。ジョブキューを賢く上手に利用することで,ユーザにストレスを与えることなく,またサーバのリソースも有効に使えるようになります。

ジョブキューは延々と動き続けるバッチ処理,というイメージが最もわかりやすいでしょう。通常のバッチ処理であればcrondを利用し,一定周期でプログラムを起動して処理を実行することになります。ジョブキューはcrondなどを利用せずプロセスを起動させ続け,処理すべきデータが渡ってくるのを待ち構えます。

現在のアプリケーション開発でジョブキューは必須のアーキテクチャと言えます。そこで本稿では,Perl界隈でよく利用されるジョブキューのしくみを中心に説明していきます。

なぜジョブキューを使うのか

ジョブキューを使う主な理由は,Webアプリケーションで処理するには重く,リアルタイム性が必要ない処理をWebのサイクルから切り離して処理を行うためです。Webアプリケーションとは物理的にサーバを分けることも可能となるので,サービスが大きくなったときなどにスケールアウトさせやすくなります。

実際の使いどころ

たとえば会員登録した際,ユーザに登録完了メールを送信することは一般的でしょう。しかしメール送信処理はリアルタイム性が必要のないものです。というのもメール送信に使われるSMTPSimple Mail Transfer Protocol自体がリアルタイム性を担保しておらず,Webで頑張って処理を行っても結局ユーザにはリアルタイムでメールが届くわけではないからです。そもそものプロトコルがリアルタイム性を持たないのであれば,Webアプリケーションでは登録完了メールを送ることをジョブキューに登録し,実際にメールが送信されたことを確認する前にユーザにすぐに登録完了画面を見せてあげるほうが親切な設計でしょう。そしてジョブキューがメール送信処理をWebのサイクルと切り離して行います。

また,ユーザがアップロードした画像に対して何か処理を行う必要があるとします。画像処理を行うライブラリは一般的にメモリを多く使用し動作も低速です。そのため,Webアプリケーション側で処理を行うには無駄が多くなります。ジョブキューで画像処理を行うようにしてしまえば,Webアプリケーションを省メモリかつ高速に動作させることができます。

COLUMN ジョブキューとメッセージキューの違い

厳格にはレスポンスを期待するのがジョブキュー,レスポンスを必要としないのがメッセージキューです。「実際の使いどころ」の項で紹介した例は,Webアプリケーション側ではキューの処理結果を受け取らずに処理を終了しているので,厳格な意味ではメッセージキューです。

ただ,ジョブキューとして作られているいくつものミドルウェアでは,レスポンスをクライアント側に返さなくてもジョブキューと名乗っています。通常は「ジョブキュー」「メッセージキュー」と考えてよいでしょう。しょせん,キューとはデータをFIFO(First In,First Out)注aで取り扱うしくみにすぎません。

注a)
「最初に入ってきたものを最初に処理する」というキューの動作原理のことです。

著者プロフィール

小林篤(こばやしあつし)

株式会社ディー・エヌ・エー プラットフォームシステムグループに所属。Mobagae APIやGadget Serverを担当。

「YAPC::Asia」や「Yokohama.pm」などでスピーカーをするなど,Perl関連のコミュニティへ積極的に参加している。YAPC::Asia2010ではベストスピーカ賞(次点)受賞。

CPANモジュールに「DBIx::Skinny」「Teng」「Qudo」など多数。

ネコが大好きだが,パグを2頭かってるプログラマ。

Twitter:@nekokak

Blog:http://blog.nekokak.org/

コメント

コメントの記入