岩本隆史の日記帳(アーカイブ)

はてなダイアリーのサービス終了をうけて移行したものです。更新はしません。

非同期処理メインのWebアプリについて考えた

先日「非同期にしたいけれど」という記事を書いてからずっと、非同期処理メインのWebアプリについて考えています。実装したわけではないため、まだ机上の空論にすぎませんが、方向性が見えてきたので備忘録として残しておきます。

前提条件

ユーザ登録処理を例に考える

現在、Pintoというソーシャルブックマークを作っているので、そのユーザ登録処理を例として考えます。

1. ユーザ登録画面リソースを取得
GET /create_user_form HTTP/1.1
Host: ja.pinto.jp
2. ユーザ登録ジョブリソースを作成
POST /create_user_jobs HTTP/1.1
Host: ja.pinto.jp

user_id=hogehoge&password=fugafuga
201 Created
Location: http://ja.pinto.jp/create_user_jobs/1

REST厨なので『RESTful Webサービス』の「8.8.2 非同期処理」に準じます。ただし、ステータスコードは「202 Accepted」でなく「201 Created」が良いと思います。要求された通りにリソースが作られているからです。

「このPOSTだってCreateなんだから非同期にすべきじゃないか」という疑問があるかもしれませんが、メッセージキューへの登録処理が走るだけなので、ボトルネックにはならないと考えています。

3. ユーザ登録ジョブリソースを取得、ステータスを確認
GET /create_user_jobs/1 HTTP/1.1
Host: ja.pinto.jp

エンティティボディに「未完了/成功/失敗」のステータスを含めます。また成功時は、ユーザリソース(http://ja.pinto.jp/users/hogehoge)へのリンクも含めます。

今のところ、Webアプリでの非同期処理は、上記のフローで必要十分なんじゃないかと思っています。

AP4Rで実装できそう

これをRubyで実装するには、AP4Rを使うのが便利そうです。Rails以外でも使えdRubyで非同期処理を書けるので、Pintoの裏側はAP4Rで実装してみるつもりです。楽しみだー。