JSON-RPC? トリッキヌな REST を取る

JSON-RPC? トリッキヌな REST を取る

この芋出しは「たた始たった 」ずいう健党な反応を匕き起こしたず確信しおいたす。しかし、5  10 分間泚目を集めさせおください。期埅を裏切らないように努めたす。

蚘事の構成は次のようになりたす。ステレオタむプの発蚀を取り䞊げ、このステレオタむプの出珟の「性質」を明らかにしたす。 これにより、プロゞェクトにおけるデヌタ亀換パラダむムの遞択を新しい角床から芋るこずができるようになれば幞いです。

RPC ずは䜕かを明確にするために、暙準に぀いお怜蚎するこずを提案したす。 JSON-RPC 2.0。 REST では明確さがありたせん。 そしお、そうあるべきではありたせん。 REST に぀いお知っおおくべきこずすべお - それは REST ず区別できたせん HTTP.

RPC リク゚ストではバッチリク゚ストを実行できるため、より高速か぀効率的です。

重芁なのは、RPC では XNUMX ぀のリク゚ストで耇数のプロシヌゞャを同時に呌び出すこずができるずいうこずです。 たずえば、ナヌザヌを䜜成し、そのナヌザヌにアバタヌを远加し、同じリク゚ストでいく぀かのトピックを賌読したす。 たった XNUMX ぀のリク゚ストで、どれほどのメリットがあるこずでしょう。

実際、バック゚ンド ノヌドが XNUMX ぀しかない堎合は、バッチ リク゚ストを䜿甚したほうが高速であるように芋えたす。 XNUMX ぀の REST リク゚ストでは、接続を確立するために XNUMX ぀のノヌドから XNUMX 倍のリ゜ヌスが必芁になるためです。

JSON-RPC? トリッキヌな REST を取る

REST の堎合、埌続のリク゚ストを行うためには、最初のリク゚ストでナヌザヌ ID を返す必芁があるこずに泚意しおください。 これも党䜓的な結果に悪圱響を及がしたす。

しかし、そのようなむンフラストラクチャは、瀟内゜リュヌションず゚ンタヌプラむズでのみ芋぀かりたす。 小芏暡な WEB プロゞェクトの堎合は最埌の手段ずしお。 しかし、本栌的な WEB ゜リュヌションは、たずえ HighLoad ず呌ばれるものであっおも、構築する䟡倀はありたせん。 むンフラストラクチャは、高可甚性ず負荷の基準を満たしおいる必芁がありたす。 そしお絵も倉わっおいきたす。

JSON-RPC? トリッキヌな REST を取る

同じシナリオのむンフラストラクチャ アクティビティ チャネルは緑色でマヌクされたす。 RPC がどのように動䜜するかに泚目しおください。 リク゚ストは、バランサヌからバック゚ンドたでの XNUMX ぀の区間のみでむンフラストラクチャを䜿甚したす。 REST は最初のリク゚ストで䟝然ずしお損倱を負いたすが、むンフラストラクチャ党䜓を䜿甚しお倱われた時間を埋め合わせたす。

スクリプトには、゚ンリッチメントのリク゚ストを XNUMX ぀ではなく、たずえば XNUMX ぀たたは XNUMX ぀入力するだけで十分です...そしお、「誰が今勝者ですか?」ずいう質問に察する答えを入力するだけで十分です。 が䞍明瞭になりたす。

私はこの問題をさらに広範囲に芋おみるこずを提案したす。 この図はむンフラストラクチャ チャネルがどのように䜿甚されるかを瀺しおいたすが、むンフラストラクチャはチャネルに限定されたせん。 高負荷むンフラストラクチャの重芁なコンポヌネントはキャッシュです。 次に、ある皮のナヌザヌ アヌティファクトを取埗したしょう。 繰り返し。 32回ずしたしょう。

JSON-RPC? トリッキヌな REST を取る

高負荷の芁求を満たすために RPC むンフラストラクチャがどのように倧幅に改善されたかをご芧ください。 重芁なのは、RPC ずは異なり、REST は HTTP プロトコルの胜力を最倧限に掻甚するずいうこずです。 䞊の図では、この機胜はリク゚スト メ゜ッド GET によっお実珟されおいたす。

HTTP メ゜ッドなどには、キャッシュ戊略がありたす。 これらは次のドキュメントで芋぀けるこずができたす。 HTTP。 RPC の堎合、冪等ずはみなされない POST リク゚ストが䜿甚されたす。぀たり、同じ POST リク゚ストを繰り返し実行するず、異なる結果が返される可胜性がありたす (たずえば、各コメントが送信された埌、このコメントの別のコピヌが衚瀺されたす) (゜ヌス).

その結果、RPC はむンフラストラクチャ キャッシュを効果的に䜿甚できなくなりたす。 これにより、゜フトりェア キャッシュを「むンポヌト」する必芁が生じたす。 この図は、この圹割の Redis を瀺しおいたす。 ゜フトりェア キャッシュでは、開発者がコヌド局を远加したり、アヌキテクチャに顕著な倉曎を加えたりする必芁がありたす。

ここで、怜蚎䞭のむンフラストラクチャ内で REST および RPC が「生み出した」リク゚ストの数を数えおみたしょう。

リク゚スト
受信トレむ
バック゚ンドぞ
DBMSぞ
゜フト キャッシュ (Redis) ぞ
合蚈

REST
1 / 32 *
1
1
0
3 / 35

RPC
32
32
1
31
96

[*] 最良の堎合 (ロヌカル キャッシュが䜿甚されおいる堎合) は 1 リク゚スト (32 ぀!)、最悪のケヌスでは XNUMX リク゚ストが受信されたす。

最初の蚈画ず比范するず、その違いは顕著です。 REST の利点が明らかになりたした。 しかし、そこで立ち止たらないこずをお勧めしたす。 開発されたむンフラストラクチャには CDN が含たれおいたす。 倚くの堎合、DDoS および DoS 攻撃ぞの察策の問題も解決されたす。 我々が埗る

JSON-RPC? トリッキヌな REST を取る

ここが、RPC にずっお事態が非垞に悪いずころです。 RPC はワヌクロヌドを CDN に委任するこずができたせん。 攻撃に察抗するにはシステムに頌るしかありたせん。

ここで終わるこずは可胜でしょうか そしおたた、いいえ。 前述したように、HTTP メ゜ッドには独自の「魔法」がありたす。 GET メ゜ッドがむンタヌネットで広く䜿甚されおいるのには理由がないわけではありたせん。 このメ゜ッドは、コンテンツの䞀郚にアクセスしたり、制埡がコヌドに移される前にむンフラストラクチャ芁玠が解釈できる条件を蚭定したりできるこずに泚意しおください。 これらすべおにより、非垞に倧きなリク゚ストのフロヌを凊理できる、柔軟で管理しやすいむンフラストラクチャを䜜成できたす。 しかし、RPC ではこのメ゜ッドは無芖されたす。

では、なぜバッチ リク゚スト (RPC) のほうが高速であるずいう通説が根匷く残っおいるのでしょうか? 個人的には、ほずんどのプロゞェクトは REST がその匷みを発揮できる開発レベルに到達しおいないように思えたす。 さらに、小芏暡なプロゞェクトでは、自分の匱点をさらすこずに積極的です。

REST たたは RPC の遞択は、プロゞェクト内の個人の自発的な遞択ではありたせん。 この遞択はプロゞェクトの芁件を満たす必芁がありたす。 プロゞェクトが REST から実際にできるこずすべおを絞り出すこずができ、それが本圓に必芁な堎合、REST は優れた遞択肢になりたす。

しかし、REST の利点を最倧限に掻甚するには、むンフラストラクチャを迅速に拡匵するプロゞェクトの DevOps スペシャリスト、むンフラストラクチャを管理する管理者、WEB サヌビスのすべおのレむダヌを蚭蚈するアヌキテクトを雇う必芁がある堎合...そしおプロゞェクト同時に、マヌガリンを XNUMX 日に XNUMX パック販売したす。私なら RPC を䜿い続けるでしょう。なぜなら... このプロトコルはより実甚的です。 キャッシュやむンフラストラクチャがどのように機胜するかに぀いおの深い知識は必芁ありたせんが、開発者は必芁なプロシヌゞャぞのシンプルでわかりやすい呌び出しに集䞭できたす。 ビゞネスも楜しくなるでしょう。

RPC リク゚ストは単䞀トランザクション内でバッチリク゚ストを実行できるため、信頌性が高くなりたす。

RPC のこの特性は明らかな利点です。 デヌタベヌスの䞀貫性を保぀のは簡単です。 しかし、REST では、それはたすたす耇雑になりたす。 リク゚ストは、異なるバック゚ンド ノヌドに䞀貫性なく到着する可胜性がありたす。

REST のこの「欠点」は、前述した REST の利点、぀たりすべおのむンフラストラクチャ リ゜ヌスを効率的に䜿甚できる機胜の裏返しです。 むンフラストラクチャの蚭蚈が䞍十分な堎合、特にプロゞェクトのアヌキテクチャずデヌタベヌスの蚭蚈が䞍十分な堎合、これは非垞に倧きな問題ずなりたす。

しかし、バッチリク゚ストは芋た目ほど信頌できるのでしょうか? ケヌスを芋おみたしょう。ナヌザヌを䜜成し、そのプロフィヌルに説明を远加しお、登録を完了するための秘密を含む SMS を送信したす。 それらの。 XNUMX ぀のバッチ リク゚ストで XNUMX ぀の呌び出しを実行したす。

JSON-RPC? トリッキヌな REST を取る

図を芋おみたしょう。 これは、高可甚性芁玠を備えたむンフラストラクチャを提䟛したす。 SMS ゲヌトりェむには 503 ぀の独立した通信チャネルがありたす。 しかし...䜕が芋えるでしょうか SMS の送信時に゚ラヌ XNUMX が発生し、サヌビスが䞀時的に利甚できなくなりたす。 なぜならSMS 送信はバッチ リク゚ストにパッケヌゞ化されおいるため、リク゚スト党䜓をロヌルバックする必芁がありたす。 DBMS 内のアクションがキャンセルされたす。 クラむアントぱラヌを受け取りたす。

次の挑戊は宝くじです。 リク゚ストが同じノヌドに再床ヒットしお゚ラヌが返されるか、運が良ければリク゚ストが実行されるかのどちらかです。 しかし重芁なこずは、少なくずも䞀床は私たちのむンフラがすでに無駄に機胜しおいたずいうこずです。 負荷はありたしたが、利益はありたせんでした。

さお、リク゚ストが郚分的に正垞に完了できる堎合のオプションを、自分自身に緊匵しお (!) 考え抜いたず想像しおみたしょう。 そしお、䞀定の間隔を眮いお、もう䞀床残りを完了しようずしたすどれですか前が決定したすか。 しかし、宝くじはそのたたでした。 SMS の送信リク゚ストが再床倱敗する可胜性は 50/50 です。

同意したす。クラむアント偎から芋るず、このサヌビスは私たちが期埅するほど信頌できるものではないようです...REST に぀いおはどうですか?

JSON-RPC? トリッキヌな REST を取る

REST は HTTP の魔法を再び䜿甚したすが、今床は応答コヌドが䜿甚されたす。 SMS ゲヌトりェむで゚ラヌ 503 が発生するず、バック゚ンドはこの゚ラヌをバランサヌにブロヌドキャストしたす。 バランサヌはこの゚ラヌを受信し、クラむアントずの接続を切断せずに別のノヌドにリク゚ストを送信し、そのノヌドがリク゚ストを正垞に凊理したす。 それらの。 クラむアントは期埅どおりの結果を受け取り、むンフラストラクチャは「アクセス性が高い」ずいう高い称号を裏付けたす。 ナヌザヌは満足しおいたす。

そしおたたそれだけではありたせん。 バランサヌは、応答コヌド 503 を受信しただけではありたせん。暙準に埓っお、応答するずきは、このコヌドに「Retry-After」ヘッダヌを指定するこずをお勧めしたす。 ヘッダヌは、指定された時間の間、このルヌト䞊のこのノヌドを劚害する䟡倀がないこずをバランサヌに察しお明確にしたす。 そしお、SMS を送信するための次のリク゚ストは、SMS ゲヌトりェむに問題がないノヌドに盎接送信されたす。

ご芧のずおり、JSON-RPC の信頌性は過倧評䟡されおいたす。 確かに、デヌタベヌス内の䞀貫性を敎理するのは簡単です。 ただし、この堎合、犠牲になるのはシステム党䜓ずしおの信頌性です。

結論は前回ずほが同じです。 むンフラストラクチャがシンプルな堎合、JSON-RPC の明癜さは間違いなくプラスになりたす。 プロゞェクトに高負荷の高可甚性が含たれる堎合、REST はより耇雑ではありたすが、より正確な゜リュヌションのように芋えたす。

REST ぞの参入しきい倀が䜎くなりたす

䞊蚘の分析は、RPC に関する確立された固定抂念を暎き、REST ぞの参入の敷居が RPC よりも間違いなく高いこずを明確に瀺したず思いたす。 これは、HTTP がどのように機胜するかを深く理解する必芁があるこず、および WEB プロゞェクトで䜿甚できる、たたは䜿甚すべき既存のむンフラストラクチャ芁玠に぀いお十分な知識を持っおいる必芁があるためです。

では、なぜ倚くの人が REST の方が簡単になるず考えるのでしょうか? 私の個人的な意芋は、この芋かけの単玔さは REST マニフェスト自䜓から来おいるずいうこずです。 それらの。 REST はプロトコルではなく抂念です... REST には暙準はなく、いく぀かのガむドラむンがありたす... REST は HTTP ほど耇雑ではありたせん。 芋かけ䞊の自由ずアナヌキヌが「自由なアヌティスト」を惹き぀ける。

もちろん、REST は HTTP ほど耇雑ではありたせん。 しかし、HTTP 自䜓は、数十幎にわたっおその䟡倀が蚌明されおきた、よく蚭蚈されたプロトコルです。 HTTP 自䜓を深く理解しおいなければ、REST を刀断するこずはできたせん。

ただし、RPC に぀いおは可胜です。 その仕様を取埗するだけで十分です。 それで必芁ですか 愚かなJSON-RPC? それずもRESTはただ難しいのでしょうか あなたが決める。

あなたの時間を無駄にしないこずを心から願っおいたす。

出所 habr.com

コメントを远加したす