RESTful Web サービス (OReilly) を読んでいます。著者は、ROA の主な機能の 1 つとして、ステートレス (リソース状態ではなくアプリケーション状態) について言及しています。
本の後半で、トランザクションについて説明するためにアカウント転送の例を取り上げたとき、オーバーロードされた POST よりも RESTful なリソースとしてトランザクションを公開するオプションについて言及しています。
トランザクションをリソースとして公開する: 本から要約すると:
$50 を当座預金 ($200) から普通預金 ($200) に送金する場合: 最終結果: 当座預金 ($250) と普通預金 ($150)
当座預金口座のリソースは で公開され/accounts/checking/11
、普通預金口座のリソースは で公開されます/accounts/savings/55
POST /transactions/account-transfer HTTP/1.1
Host: example.com
返す
201 Created
Location: /transactions/account-transfer/11a5
$150 を当座預金に入れる
PUT /transactions/account-transfer/11a5/accounts/checking/11 HTTP/1.1
Host example.com
balance=150
250 ドルの貯蓄
PUT /transactions/account-transfer/11a5/accounts/savings/55 HTTP/1.1
Host: example.com
balance=250
そして最後に commit=true を入れます
PUT /transactions/account-transfer/11a5/1.1
Host: example.com
committed=true
これは、トランザクションに関連付けられたアクションのキューを構築することで実装できると彼は言います。本から:
トランザクションがコミットされると、サーバーはデータベース トランザクションを開始し、キューに入れられたアクションを適用してから、データベース トランザクションをコミットしようとします。
私の質問は:
サーバーでアクションのキューを維持していませんか? (アプリケーション状態)? したがって、無国籍は侵害されますか?
カイ・マターンの回答後の編集
あなたが言っているのは、このアクションのキューはリソースの状態であり、アプリケーションの状態ではないということだと思います。この本もこの区別をしており、リソースの状態は OK ですが、アプリケーションの状態ではないと述べています。
しかし、負荷分散されたサーバー間でステートレス アプリケーションを分散できるという事実からステートレス性について考えると、上記の一連の POST と PUT ではそれができません。アクションのキューがその 1 つのサーバーで維持されるため、ロード バランサーはすべての要求を 1 つの特定のサーバーに送信する必要があります。それ以外の場合、上記のリソースが複数のマシンに存在するように分割されている場合 (ロード バランシングを有効にするため)、RESTful 2 フェーズ コミット トランザクションのようなものが必要になる場合があります。
したがって、この特定の例では、オーバーロードされた POST ステートレス アプリと 2 フェーズ コミット ステートレス アプリの 2 つのオプションを検討しています。
そうですか?