yohei-y:weblog

XML と REST/Web サービス関連の話題が中心の weblog です

2007-10-28

ステートレスとは何か

RestWiki をたまに見直すと新たな発見があって面白い。

たとえば先日、「ステートレスなやりとりとは何か(What is Stateless Interaction?)」という箇所を見つけて、興味深く読んだ。このページは以前も絶対に読んでいるはずなのだが、 人間は忘れてしまうものである。

RestWiki の例でも充分わかりやすいのだけれど、自分でも例を思いついたので書きとめておく。

ステートフルサーバとステートレスサーバはどう違うのか。

まずは、ステートフルの例:

  • 客: こんにちは
  • 店員: いらっしゃいませ。○○バーガーへようこそ
  • 客: ハンバーガーセットをお願いします
  • 店員: サイドメニューは何になさいますか?
  • 客: ポテトで
  • 店員: ドリンクは何になさいますか?
  • 客: ジンジャーエールで
  • 店員: +50円でドリンクをLサイズにできますがいかがですか?
  • 客: Mでいいです
  • 店員: 以上でよろしいですか?
  • 客: はい
  • 店員: かしこまりました

これはいたって普通の会話に見える。では、ステートレスな場合はどうなのか。

  • 客: こんにちは
  • 店員: いらっしゃいませ。○○バーガーへようこそ
  • 客: ハンバーガーセットをお願いします
  • 店員: サイドメニューは何になさいますか?
  • 客: ハンバーガーセットをポテトでお願いします
  • 店員: ドリンクは何になさいますか?
  • 客: ハンバーガーセットをポテトとジンジャーエールでお願いします
  • 店員: +50円でドリンクをLサイズにできますがいかがですか?
  • 客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします
  • 店員: 以上でよろしいですか?
  • 客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします。以上
  • 店員: かしこまりました

これは明らかに冗長であほらしいのだけれど、サーバがステートレスというのはこういうことである。

ステートフルの例では、2回目以降の対話では、客(クライアント)はそれまでの前提(ハンバーガーセットを頼んでいること)は 繰り返さなくてもよかった。なぜか。それは店員(サーバ)が客(クライアント)の注文状態を覚えていたからである。 この店員(サーバ)は「この客(クライアント)はハンバーガーセットをポテトで頼んでいる」ということを覚えている。 これをアプリケーション状態、あるいはセッション状態と呼ぶ。 次にドリンクの種類を聞いたときに店員(サーバ)は自分で覚えている客(クライアント)のアプリケーション状態を 「この客はハンバーガーセットをポテトとジンジャーエールで頼んでいる」と更新する。

ファーストフード店の店員であれば、ステートフルな実装は当たり前なのだが、Web サーバは異なる。 それはスケーラビリティの問題である。 店員(サーバ)が一人の客(クライアント)をずっと相手にしていると、その間別の客に対応することができない。 店が込んできたら(アクセスが集中したら)、店員を増員して(Webサーバを増設して)対応する。 普通の店舗では、ひとつのレジで一人の店員がずっと同じ客を受け付けるのだが、 Web の場合は複数の Web サーバ(比較的少数)で複数のクライアント(比較的多数)を同時に受け付ける。 ここで、ステートレスサーバであれば、以下のように、各インタラクションで別々の店員(サーバ)が 客(クライアント)の注文(リクエスト)に応答(レスポンス)することが可能になる。

  • 客: こんにちは
  • 店員1: いらっしゃいませ。○○バーガーへようこそ
  • 客: ハンバーガーセットをお願いします
  • 店員2: サイドメニューは何になさいますか?
  • 客: ハンバーガーセットをポテトでお願いします
  • 店員3: ドリンクは何になさいますか?
  • 客: ハンバーガーセットをポテトとジンジャーエールでお願いします
  • 店員4: +50円でドリンクをLサイズにできますがいかがですか?
  • 客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします
  • 店員5: 以上でよろしいですか?
  • 客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします。以上
  • 店員6: かしこまりました

ステートレスサーバというのは一見冗長なように見えるが、 スケーラビリティの観点から見ると、理に適っているものである。

合わせて読みたい: A Web-Centric Approach to State Transition

ラベル:

2007-10-12

AtomPub が RFC 5023 に/日本語訳を公開します

AtomPub がついに RFC になりました!

関係者のブログ

RFC になるまでずいぶんと長かったように感じますが、 その分完成度は上ったのだと思います。 interop もすでに何回も開催されており、その結果も良好です。

AtomPub は全ての、とはいかないまでも、多くの Web サービスのベースとなることが できるプロトコルです。 たとえば blog 、何らかのデータベース、画像/映像リポジトリ、 Wiki、カレンダー、ソーシャルブックマークなど、title/author/updated というメタデー タがあって、その読み書きができるサービスは全て AtomPub ベースの API を 出せる可能性があるでしょう。

さて、そんな AtomPub を会社の同僚と翻訳したので、公開したいと思います。

draft-15 から翻訳を始めたので、比較的長い時間レビューしていますが、 それでもミスや変なところがある可能性はあります。 もし何か問題があれば、ご連絡ください。

AtomPub 実装者の方々の一助となれば幸いです。

追記: 技評さんが gihyo.jp で取り上げてくれた

さらに追記(2007-10-21): WEB+DB PRESS の連載で AtomPub を取り上げています。 今月発売の Vol.41 では AtomPub で導入されたサービス文書やメディアエントリの解説をしています。

photo
WEB+DB PRESS Vol.41
WEB+DB PRESS編集部
技術評論社 2007-10-24

コレクションとエントリの基本を解説した Vol. 40 と合わせてどうぞ。

photo
WEB+DB PRESS Vol.40
WEB+DB PRESS編集部
技術評論社 2007-08-24

ちなみに Vol. 41 では RFC 5023 という番号を紙面に入れることができました。 正にぎりぎりの修正だったのですが、間に合ってよかった。

ラベル: , ,