RESTおそらく誰もが気づく最初のことの1つは、トランザクションセマンティクスが定義されていないことであり、これは暗黙のうちにREST is 、他の人がそうしようとすると、RESTシステムを「汚染」することになります。
しかし、引数のためにRESTが人気のある 'api'の選択になり、宇宙のすべてのサイトが安らかなエントリポイントを公開し始めたと言えます。
これらはトランザクションの振る舞いなしでどのくらい正確に使用できますか? RESTの利点の1つは、データのコンポーネントを分解することです。これにより、スマートクライアントがデータを作成(および作成、調整など)データ)を複数のサービスから取得しますが、このデータの構成に対する変更をアトミックかつ単独で行うことができない場合、RESTを使用しても意味がありません。
時間が経ち、深刻なデータ公開の必要性が到来すると、シンプル(RESTが勝ちます)で、トランザクションの動作をサポートするため、このデータを確実に操作できるようになります。
今、私は研究で特定の議論を数回読んでおり、それはRESTでのトランザクションについてどのように考えるかに関連しており、与えられた例はショッピングカートです。あなたのです。
しかし、私はこの議論に反対します。まず、ショッピングカートの分離は単に便利であり、これはトランザクションの分離ではありません。アプリケーションの一部がデータを読み取っている間にカートに対して操作を同時に行うとどうなりますかそれから?アプリケーションの読み取り部分に、「まだトランザクション中」のデータが表示されるとは思わないでしょう。
すべてのデータ変更が暗黙的なトランザクションモデルを持っているわけではないという事実は言うまでもなく、複数のサービスを介したトランザクションは間違いなくそうではありません。
トランザクションが発生する必要があり、実際のREST呼び出しが事実を知らないようにする方法で発生する必要があるように思えますヘッダーの追加は問題ありません)。
RESTを介してトランザクションモデルを作成する方法についていくつかの提案を読みましたが、記述されている仕様のいくつかはごく最近のようです。
これについて本当の考えはありますか? RESTよりも「何か」があるべきではないので、RESTの単純化された性質は、堅実なデータ操作(「酸性」トランザクション)に対して利用できます。
そうでない場合、私たちは本当に前に出て、純粋なデータの世界でやり取りしたいなら、おそらく石鹸のようなモノリシックなものをサポートする必要があるとサービス開発者に伝えますか?またはさらに悪いことに、独自のカスタムトランザクションサポートをRESTのようなものに組み込み、各サービスを非標準にし、RESTの全力を破壊しますか?
ご意見をお寄せいただきありがとうございます。
編集、簡単なシナリオを追加:
アルバムの作成を処理するクライアントフォームを想像してください。そのアルバムの利便性のために、ユーザーにアーティストリソースのuriを提供するよう求めるのではなく、アーティストのリストから選択できます(アーティストカタログから取得する可能性が最も高い) 。
使いやすさのために、クライアントはアーティスト名を手動で記述して、アーティストを「インライン」で作成できます..投稿シナリオでは、クライアントコードはこれを理解し、アルバムを作成するリクエストを送信する前に、最初に決定しようとしますアーティストが既に存在する場合は、そのアーティストのURIを取得します。存在しない場合は、アーティストを作成し、アーティストのURIを取得します。
クライアントコードは引き続きアルバムの作成を続行します。これは通常のクライアントよりも賢く、REST and 'dumbly' Postingのすぐ上に座っているわけではありませんが、代わりにより純粋なRESTロジックを処理します。
ただし、このシナリオでは、アーティストが最初に作成された場合、アルバムが作成されない限り、アーティストが作成されないことを保証するのは良いことです。
これは、トランザクションが意味するほど「クリティカル」ではありませんが、クライアントコードが1つの操作として実行することを好む一連の作業を定義します(結局、このISユーザーに対する単一の操作のように)。
このシナリオで私が見た唯一のガイダンスは、アルバムの作成が失敗した場合にクライアントに補正アクションを実行させ、具体的にはアーティストを削除するように呼び出すことです。しかし、クライアントはアーティストが孤立していると想定しているため、可能性は低いですが、別のクライアントがそのアーティストを既に「見た」と割り当てた場合はどうなりますか?
これらはデータ変更を行うことに関する私の懸念であり、確かに他のギャップ(アーティストは後日削除することはできなかったと言います)がありますが、それらのアクションは透明ではありません(つまり、アクションは自動化されたものではありません)クライアントですが、ユーザーが具体的に要求したもの)。
これがトピックの一部を明らかにするのに役立つことを願っています。
トランザクションについて話すときは、分散 Two Phase Commit プロトコルについて話していると仮定します。
私が正しく理解していれば、RESTが複数のシステムにまたがる操作を実行するために、RESTが異なるRESTリクエスト。問題は、一貫性を実現するためにトランザクションを使用する必要があるという潜在的に欠陥のある仮定を行っていることです。
Amazonで働いていて現在はMicrosoftにいるPat Hellandは、論文 Life beyond beyond Distributed Transactions を書きました。論文では、著者は次のように述べています。
残念ながら、eコマース、サプライチェーン管理、金融、ヘルスケアアプリケーションなどのビジネス目標を解決しようとするプログラマーは、分散トランザクションを使用しないスケーリングについて考える必要性が高まっています。これは、分散トランザクションを使用しようとする試みが非常に脆弱であり、パフォーマンスが低いためです。
彼の論文では、拡張性とパフォーマンスが優れた分散トランザクションの代替ソリューションを検討しています。
たぶんRESTはトランザクションをサポートしていないので成功するでしょう。これはRESTという用語を発明した人であるRoy Fieldingからの引用です。
分散トランザクションプロトコルが必要な場合は、アーキテクチャがRESTに基づいていると言えるでしょうか。クライアントとサーバーでRESTfulアプリケーションの状態を使用してすべての状態遷移を判断するという1つの状況から、クライアントがサーバーに管理方法を伝える必要があるトランザクションセマンティクスの分散合意を必要とする次の状況にどのように到達できるかわかりません独自のリソース。
...今のところ、私は「残りのトランザクション」を矛盾と見なします。
これは、2009年6月9日のRESTディスカッションリストのメッセージからです。Yahooグループは役に立たないため、リンクを提供できません。
ReST API関数でのReSTアプリケーションでトランザクションが必要な場合、通常は、技術的なWebサービス担当者がまだGoogleを使用しているためです。
別の方法で見てみましょう。
GoogleをSoapする:トランザクションを開き、顧客レコードを作成し、注文レコードを作成し、トランザクションをコミットします。
ReST googles on:サーバーに何をすべきかを尋ねます。サーバーは「顧客リソースの作成」と言うので、POST/customers。サーバーは「必要に応じて注文を作成してください」と言い、クライアントはフォームに従って注文を作成します。
ReSTでは、アプリケーションプロトコルは、トランザクション境界を持つデータではなく、作成および操作されるリソースに関して表現されます。
これらのすべての操作にまたがる長期実行トランザクションが必要な場合、クライアントではなく、開始を決定するのはserverです。
それでも、サーバー側で長時間実行されるトランザクションを実装できます。クライアント側からトランザクションを取得しようとする場合、クライアントは実行しようとしているすべての操作と、それらの操作の間に存在するトランザクション境界を既に知っていると想定します。それがあなたのクライアントの期待であるならば、あなたはすでにレイトバインディングのハイパーメディア駆動型の休息アーキテクチャの性質をあきらめています。
確かに、ReSTを実行しておらず、HTTP経由のRPCに適合しようとしている場合、トランザクションがないことに問題があります。
通常、トランザクションを必要とするほとんどのアクションは、トランザクションなしで発生するように作り直すことができると思います。
たとえば、古典的な銀行振込。アカウントAからBに100ドルを移動するとします。
取引開始 /デビットA、100ドル /クレジットB、100ドル コミット取引
これは次のように修正できます。
/Transfer A、B、$ 100
このように、サーバーはこれを2つのステップで実行できますが、クライアントからのアクションは論理的に意味のある単一のアトミック操作です。
すべての操作または何もしない操作を行う方が便利な例はたくさんあると確信しています(そして、それらに対処するために人々が何を思い付くことができるのか興味があります)が、私は通常この方法で物事をやり直します。
REST操作は、トランザクションを開始し、複数のデータベースまたはその他のトランザクション操作を実行し、コミットまたはロールバックできます-すべてトランザクションの範囲内です。
RESTができないことは、トランザクションのルート以外になることです。トランザクションを開始してから、2つのREST操作とデータベース操作を実行することはできませんこれは、.NETのASMX Webサービスの状況に似ています。トランザクションのルートになりますが、それだけです。WCFが導入され、WS-Transactionsをサポートするまで、何年も成功していました。現在、WCFを使用しているため、ほとんどのWebサービス操作は、あなたが求めている意味でトランザクションである必要はありません。
REST=を使用したトランザクションは実際に達成可能であると思います。トランザクションは、作成(開始)、編集(変更をポスト)、削除(コミット、ロールバック)できるリソースと考えてください。トランザクションに投稿された変更は、トランザクションがコミットされるまでグローバルステートを変更する必要がなく、コミット中に必要なグローバルステート整合性ルールを適用できます。認可ルール。
この概念の一般的な図についてはすでに言及しました。
今、私は研究で特定の議論を数回読んでおり、それはRESTでのトランザクションについてどのように考えるかに関連しており、与えられた例はショッピングカートです。あなたのです。
しかし、私はこの議論に反対します。まず、ショッピングカートの分離は単に便利であり、これはトランザクションの分離ではありません。アプリケーションの一部がデータを読み取っている間にカートに対して操作を同時に行うとどうなりますかそれから?アプリケーションの読み取り部分に、「まだトランザクション中」のデータが表示されるとは思わないでしょう。
トランザクションの表示を許可しないのはなぜですか?保留中の変更のリストであるものとして提示する限り、その機能を提供することは実際に役立ちます。ただし、表示したくない場合は、リソースのGET
を無効にすることができます。
これは興味深いトピックです。既に述べたように、SOAPには既にこの種の機能がありますが、SOAPが本格的なセキュリティとトランザクションを検討する段階まで成熟するまでに何年もかかりました。それ以前は、CORBAでした。
セキュリティやトランザクションなど、SOAPのさまざまな高度な拡張機能を正しく機能させるには、多くの人々が多大な労力を費やしました。これは、一晩RESTには発生せず、まったく発生しない可能性があります。
RESTの現在の人気の多くは、設計が不十分で複雑すぎるSOAP実装に対する反発のようなものだと思います。これはSOAPがそうである必要がないためですそれ。他のものと同様に、うまく動作させるには良いデザインが必要です。
OpenStreetMap API をご覧ください。私はそれが一種の「REST」であり、一種の「トランザクション」を提供すると思います-「チェンジセット」と呼ばれます。それはあなたが必要なものですか?
実際、REST内のトランザクションは、従来のSOAPで動作すると想定されるのとほぼ同じように動作しますサービス。
クライアントが「トランザクションの開始」コマンド(または暗黙的に開始するがトランザクションをコミットしない操作)を発行し、その後に追加の操作が続き、別の暗黙的/明示的な「トランザクションの終了」コマンドが続くRPCスタイルのトランザクションは時代遅れです。 Webサービスの世界は、かなり前にRPCモデルから遠ざかりました。 SOAPでエンコードされたRPCは、WS-Iにも準拠していません!
proceduresの代わりに、今日のSOAPサービスはmessagesの概念に基づいて構築されています。 1つのメッセージには、完全なトランザクションを実行するために必要な情報がall含まれています。注文を送信する場合、OrderRequest
メッセージには、顧客情報、注文情報、注文の詳細、支払いの詳細など、サーバーが単一の注文について知る必要があるすべてのものが含まれます。
分散トランザクションのセマンティクスを定義するWS-Transactionsがありますが、これらは実際にはクライアントからのRPCのようなセマンティクスをサポートすることを目的としておらず、同じトランザクションに複数のサービスを参加させる必要がある場合のオーケストレーションを対象としています。たとえば、注文サービスは支払い処理サービスに参加してクレジットカード情報を検証し、支払いを転記する必要があります。これは、フルフィルメントサービスが在庫切れなどを検出した場合にロールバックする必要があります...アイデアを得る。これはすべてサーバー環境で行われるため、RESTで同じことを行うことを妨げるものは何もありません。
RESTでは、messagesの代わりにresourcesがありますが、概念は本当に似ています。 OrderRequest
メッセージの代わりに、クライアントはPUT
リソースを送信(Order
)し、リソースにはトランザクションを完了するために必要なすべての同じ情報が含まれている必要があります。確かに、複雑なオーケストレーションを実行しようとしている場合、RESTはSOAPに比べて少し扱いにくいかもしれませんが、RESTを使用し続けることができないわけではありませんfront-end、ちょうどSOAPがback-endサービス。
しかし現実には、99%の時間、人々はWS-Transactionsの複雑さを必要としません。これは、SOAP(WCF)をほぼ排他的に使用し、WS-Transactionsを使用することはほとんどないためです。
RESTでは、「状態」はクライアントにあります。サーバーはクライアントに、「このリソースを作成する(このトランザクションを完了する)ために必要なすべての情報があります」と伝えます。しかし、この空白のフォームは実際にはトランザクションをbeginしません。実際に情報を提供するのはクライアント次第です。いわば、フォームに記入してください。フォームへの入力中にクライアントが行うことは、サーバーには関係ありません。最終的に完成したフォームをクライアントがサーバーに送信すると、フォーム全体が検証されます。クライアントが「作業」を追跡していることを除いて、作業単位に似ています。
これにより、トランザクションがどのように行われ、RESTを介してare達成されるかをよりよく理解できますように。それらは、より豊富なメッセージ/リソースの概念と楽観的な同時実行性の形式に依存しています。
すべてのシステムがトランザクションを必要とするわけではないためです。
請求書などを作成、取得、および操作するためのRESTベースの非トランザクションAPIを備えた非常に成功したオンラインアカウンティングシステム(SaaS)を知っています。 APIは保守が容易で、さまざまなプラットフォームで使用でき、後方互換性を比較的簡単に確保できます。
トランザクションの欠如は大きな苦痛になりますが、ほとんどの場合、サーバーの負荷が高くない場合、APIは非常にうまく機能します。
時々、完璧ではないだけで十分な場合もあります。