非同期処理メインのWebアプリについて考えた
先日「非同期にしたいけれど」という記事を書いてからずっと、非同期処理メインのWebアプリについて考えています。実装したわけではないため、まだ机上の空論にすぎませんが、方向性が見えてきたので備忘録として残しておきます。
前提条件
- Create/Update/Deleteのリクエストは非同期で処理する(参照:Life is beautiful: マルチスレッド・プログラミングの落とし穴、その2)
ユーザ登録処理を例に考える
現在、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で実装してみるつもりです。楽しみだー。