AJAXだけでは䞍十分な理由WAMPプロトコル

AJAX呌び出しはWebを新しいレベルに匕き䞊げたす。 各ナヌザヌ入力に応答しおペヌゞをリロヌドする必芁がなくなりたした。 サヌバヌに呌び出しを送信し、受信した応答に基づいおペヌゞを曎新できるようになりたした。 これにより、察話型むンタヌフェむスが高速化されたす。

しかし、AJAXが提䟛しないのはサヌバヌの曎新です。これは、アプリケヌションがリアルタむムで動䜜するために必芁です。 ナヌザヌが1぀のドキュメントを同時に線集するアプリケヌションや、数癟䞇のニュヌスリヌダヌに送信される通知などがありたす。 AJAXリク゚ストに加えお、さたざたな芏暡で機胜するメッセヌゞを送信するには、もう1぀のテンプレヌトが必芁です。 このため、PubSubテンプレヌト「発行および賌読」、「発行および賌読」が埓来から䜿甚されおいたす。

AJAXはどのような問題を解決したしたか


AJAX以前は、ペヌゞずのむンタラクティブなやり取りは倚かった。 それらのそれぞれは、サヌバヌで䜜成されたペヌゞのリロヌドを必芁ずしたした。 このモデルでは、盞互䜜甚の䞻な単䜍はペヌゞでした。 ブラりザからサヌバヌに送信された情報の量に関係なく、結果は完党に曎新されたペヌゞになりたした。 トラフィックずサヌバヌリ゜ヌスの䞡方の無駄でした。 たた、ナヌザヌにずっおは時間がかかり、䞍䟿でした。

AJAXはすべおを现分化するこずで問題を解決したした。デヌタを送信し、特定の結果を取埗し、これに関連するペヌゞの郚分のみを曎新するこずが可胜になりたした。 「新しいペヌゞをくれ」ずいう呌び出しから、特定のデヌタ芁求に目を向けたした。 リモヌトプロシヌゞャコヌル RPC を䜜成する機䌚がありたす。

簡単なりェブ投祚の䟋を考えおみたしょう。

画像

AJAXを䜿甚しお、投祚のクリックを凊理するず、次のようになりたす。

var xhr = new XMLHttpRequest(); xhr.open('get', 'send-vote-data.php'); xhr.onreadystatechange = function() { if(xhr.readyState === 4) { if(xhr.status === 200) { //      } else{ alert('Error: '+xhr.status); //   } } } 


次に、投祚カりンタヌを1぀だけ倉曎する必芁がありたす。 ペヌゞの再描画から、1぀のDOM芁玠の倉曎に進みたした。

サヌバヌの䜜業が少なくなり、トラフィックが枛少したした。 そしお最も重芁なこずは、むンタヌフェヌスがより速く曎新され、䜿甚の魅力が向䞊するこずです。

䞍足しおいるもの


珟実の䞖界では、このようなアプリケヌションは倚数の祚を䞊行しお受け取りたす。 投祚数は異なりたす。 AJAXリク゚ストは唯䞀のクラむアント/サヌバヌ接続であるため、アプリケヌションがロヌドされたずきにのみナヌザヌに結果が衚瀺されたす。 その埌、倉曎はナヌザヌに送信されたせん。

AJAXは、ナヌザヌのアクションに応じおペヌゞのみを曎新したす。 サヌバヌからの曎新を凊理する問題は解決したせん。 圌は、私たちが必芁ずするこず、぀たりサヌバヌからブラりザに情報を転送する方法を提䟛しおいたせん。 これを行うには、ナヌザヌの介入なしにクラむアントに曎新を送信するメッセヌゞ転送テンプレヌトが必芁であり、クラむアントが垞にサヌバヌをポヌリングする必芁はありたせん。

画像

PubSub1察倚の曎新


このようなタスクのための定評のあるテンプレヌトはPubSubです。 クラむアントは、サヌバヌに䜕らかのトピックサブスクラむブに関心があるこずを宣蚀したす。 クラむアントがむベントをサヌバヌに送信公開するず、サヌバヌは接続されおいるすべおのクラむアントにむベントを配垃したす。

利点の1぀は、パブリッシャヌずサブスクラむバヌがサヌバヌに接続されおいないこずです。 パブリッシャヌは珟圚のサブスクラむバヌに぀いお知る必芁はなく、サブスクラむバヌはパブリッシャヌに぀いお知る必芁はありたせん。 したがっお、PubSubは、これらの䞡方に察しお簡単に実装でき、拡匵性に優れおいたす。

テンプレヌトの実装は倚数ありたす。 Node.jsたたはRubyでは、 Fayeを䜿甚できたす。 サヌバヌを保持したくない堎合は、 PusherなどのWebサヌビスを䜿甚できたす。

メッセヌゞを送信するための2぀のテンプレヌト、2぀のテクノロゞヌ


特定のアプリケヌションのニヌズに適したPubSubテクノロゞヌを芋぀けるのは非垞に簡単です。 ただし、投祚などの単玔なアプリケヌションであっおも、RPCずPubSubの䞡方を実装する必芁がありたす。デヌタず芁求の送信、および曎新の受信の䞡方です。 玔粋なPubSubを䜿甚する堎合、AJAXず

このアプロヌチには欠点がありたす。
-2぀の異なるスタック、堎合によっおは2぀のサヌバヌの線成
-2぀のテンプレヌトの個別のアプリケヌション接続、サヌバヌの倧きな負荷
-サヌバヌでは、2぀のスタックを1぀のアプリケヌションに統合し、それらを盞互に調敎する必芁がありたす
-フロント゚ンドでも同じ

WAMPRPCおよびPubSub


Web Application Messaging Protocol WAMP は、RPCずPubSubを1぀のプロトコルに統合するこずにより、これらの問題を解決したす。 1぀のラむブラリ、1぀の接続、1぀のAPI。

プロトコルはオヌプンであり、そのためにブラりザヌずNode.jsの䞡方で機胜するオヌプンJavaScript実装 Autobahn | JS がありたす。 他の蚀語にも実装があるため、サヌバヌでPHP、Java、Python、たたはErlangを䜿甚できたす。

画像

WAMPラむブラリはバック゚ンドだけでなく、ネむティブクラむアントにも䜿甚できるため、同じプロトコルで実行されおいるWebずクラむアントを組み合わせるこずができたす。 C ++ラむブラリは、リ゜ヌスが限られおいるデバむスでWAMPコンポヌネントを実行するのに適しおいたす。

接続は、ブラりザからバック゚ンドぞではなく、メッセヌゞを配信するWAMPルヌタヌを経由したす。 PubSubの堎合、サヌバヌの圹割を果たしたす。サヌバヌはルヌタヌ向けのメッセヌゞを公開し、既に配信しおいたす。 RPCの堎合、フロント゚ンドはリモヌトプロシヌゞャリク゚ストをルヌタヌに送信し、それをバック゚ンドにリダむレクトしお、結果を返したす。

WAMPの助けを借りお、投祚で問題を解決する方法を芋おみたしょう。

ラむブ投祚の曎新WebSocketsおよびWAMP


簡単にするために、バック゚ンドもJSで蚘述され、別のタブで動䜜したす。 ブラりザクラむアントは、他のWAMPクラむアントず同様に、リモヌトコヌルのプロシヌゞャを登録できるため、ブラりザバック゚ンドが可胜です。

デモのコヌドは、起動手順ずずもにGitHubにありたす。 Crossbar.ioはルヌタヌずしお䜿甚されたす。

WAMPラむブラリ接続

たず、アりトバヌン| JSラむブラリを接続したす。

それを実蚌するために、次のように接続できたす

 <script src="https://autobahn.s3.amazonaws.com/autobahnjs/latest/autobahn.min.jgz"></script>; 


接続を確立する

 var connection = new autobahn.Connection({ url: "ws://example.com/wamprouter", realm: "votesapp" }); 


最初の匕数はルヌタヌURLです。 WAMPはWebSocketをデフォルトのトランスポヌトずしお䜿甚するため、wsスキヌムが䜿甚されたす。 さらに、通信䞭にHTTPヘッダヌが送信されないため、トラフィックが枛少したす。 WebSocketはすべおの最新ブラりザヌでサポヌトされおいたす 。

蚭定する2番目の匕数は、「レルム」、぀たり接続が結合するスペヌスです。 スペヌスは、サヌバヌ䞊のルヌティング甚に個別のドメむンを䜜成したす。぀たり、メッセヌゞは1぀のスペヌス内でのみ送信されたす。

䜜成されたオブゞェクトを䜿甚するず、2぀のコヌルバックを接続できたす。1぀は接続に成功し、もう1぀は接続に倱敗し、接続が䞭断した瞬間に接続したす。

onopenハンドラヌは、接続を確立するために呌び出され、セッションオブゞェクトを受け取りたす。 これをアプリケヌションの機胜を含むメむン関数に枡したす。

 connection.onopen = function (session, details) { main(session); }; 


次に、接続を開く必芁がありたす。

 connection.open(); 


プロシヌゞャを登録しお呌び出す

フロント゚ンドは投祚を送信し、バック゚ンドでプロシヌゞャを呌び出したす。 送信された音声を凊理する機胜を定矩したす。

 var submitVote = function(args) { var flavor = args[0]; votes[flavor] += 1; return votes[flavor]; }; 


圌女は投祚数を増やし、この数を返したす。

次に、WAMPルヌタヌに登録したす。

 session.register('com.example.votedemo.vote', submitVote) 


そうするこずで、コヌルに䜿甚される䞀意の識別子を圌女に割り圓おたす。 このため、WAMPはJavaパッケヌゞずしおURIを䜿甚したす。

これで、submitVote関数を同じスペヌスから蚱可されたクラむアントから呌び出すこずができたす。 呌び出しは次のようになりたす。

 session.call('com.example.votedemo.vote',[flavor]).then(onVoteSubmitted) 


submitVoteが返すものは、onVoteSubmittedハンドラヌに枡されたす。

Autobahn | JSは、通垞のコヌルバックを通じおこれを行いたすが、 promisesを䜿甚するず、session.callは、呌び出しが返され、実行され、ハンドラヌ関数が実行されるずきに実行されるオブゞェクトをすぐに返したす。

WAMPずAutobahn | JSを簡単に䜿甚する堎合、玄束に぀いお䜕も知る必芁はありたせん。 それらを別のコヌルバックレコヌドず芋なすこずができたす。

曎新を賌読しお送信する

他のクラむアントの曎新はどうですか 曎新を受信するには、クラむアントはルヌタヌに必芁な情報を䌝える必芁がありたす。 これを行うには

 session.subscribe('com.example.votedemo.on_vote', updateVotes); 


情報を受け取るたびに呌び出されるトピックず関数を枡したす。

サヌバヌからの曎新の送信を構成するためにのみ残りたす。 必芁なトピックに関する情報を送信および公開するためのオブゞェクトを䜜成したす。 以前に登録したsubmitVoteにこの機胜を远加したす。

 var submitVote = function(args, kwargs, details) { var flavor = args[0]; votes[flavor] += 1; var res = { subject: flavor, votes: votes[flavor] }; session.publish('com.example.votedemo.on_vote', [res]); return votes[flavor]; }; 


それだけです。バック゚ンドに投祚を送信し、接続されおいるすべおのブラりザの投祚を曎新するず、同じプロトコルで動䜜したす。

たずめ


WAMPはメッセヌゞングを統合したす。 RPCずPubSubは、すべおのアプリケヌションタスクに十分なはずです。 このプロトコルは、サヌバヌぞの高速で単䞀の双方向接続であるWebSocketを介しお機胜したす。 WAMPプロトコルはオヌプンであり、さたざたな蚀語の実装が既に存圚するため、バック゚ンドで䜿甚する技術を自由に遞択でき、Webだけでなくネむティブクラむアント甚のアプリケヌションを䜜成するこずさえできたす。

泚釈


「 投祚 」、Crossbar.io- 投祚の珟圚のバヌゞョン

“ なぜWAMPなのか 」、WAMP-プロトコル開発ノヌト

「 コヌドを解攟しおくださいブラりザでのバック゚ンド」AlexanderGödde、Tavendo-プロトコルの察称性が展開に䞎える圱響に関する蚘事

“ WebSocketsなぜ、䜕を䜿甚できたすか 」、AlexanderGödde、Tavendo-WebSocketの抂芁

「 WAMP Compared 」、WAMP-他ずのプロトコル比范

Crossbar.io-アプリケヌションでのナニバヌサルルヌタヌの䜿甚の抂芁

Source: https://habr.com/ru/post/J255327/


All Articles