2

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 つのオプションを検討しています。

そうですか?

4

1 に答える 1

2

ステートレスとは、アプリケーションが完全に無知であることを意味するものではありません。これは、アプリケーションがURL、Cookie、さらに重要なことにデータベース以外の手段でその状態を記憶していないことを意味します。

これにより、そのセッション情報がセッションリソースのようなものにマップされていない限り、サーバーセッションのようなものにデータを保存するべきではありません。

アクションがリソースにマップされている限り、ステートレスになる可能性があります。

アクションをURLにマッピングすると、/ transactions/startTransactionのようなURLのようなアクションを作成しようとすることがよくあることに注意してください。これは間違っています。リソースは動詞ではなく名詞と考えてください。

したがって、たとえば:

logging in -> create a session resource 
logging out -> delete the session resource

あなたの例が示しているのは、まさにその振る舞いです:あなたはリソースを作成します(アカウント転送)。関連するすべてのデータを含むように変更します。次に、コミットしてその状態(はい、状態)を変更します。

コミットフラグが書き込まれるとすぐに、バックエンドはこのトランザクションを処理します。これは、トランザクションをキューに入れることで実行できます。しかし、その部分はフロントエンドの一部ではありません-そして無国籍はそこで止まるかもしれないし、止まらないかもしれません。

したがって、質問に答えるには、データの状態とアプリケーションの状態を混在させないでください。リソースとしてアクションのキューを維持することはステートレスです。サーバーメモリ(ステートフルアプリケーションサーバーセッション)でのアクションの維持はそうではありません。

于 2012-08-29T17:00:50.990 に答える