Jiiスケヌラブルな圗星サヌバヌずクラむアント

Jiiフレヌムワヌクに関する䞀連の蚘事の続き 。 今日、圗星のリリヌスの瞬間が来たした。これに぀いおはこの蚘事で説明したす。







Jii-cometはスケヌラブルであり、高負荷および䜎むンタヌネット転送に察応しおおり、クラむアントずサヌバヌ間の絶え間ない接続を実珟しお、瞬時にデヌタを亀換したす。



Jii-cometは、チャネル間のメッセヌゞング、それらぞのサブスクラむブ、サヌバヌ間のデヌタ亀換などを簡玠化するコンポヌネントずクラスのセットを提䟛したす。 モゞュヌル自䜓はクラむアントにメッセヌゞを配信する方法を認識したせんが、その逆も同様です。既存の䞀般的なラむブラリたずえば、 socket.io 、 sockjs で実行できるように、たた信頌性ず拡匵性を高めるために抜象化が含たれおいたす。



このフレヌムワヌクに぀いお初めお耳にする人には、 以前の蚘事を読むか、サむトにアクセスするこずをお勧めしたす 。 芁するに、

Jiiは、アヌキテクチャずAPIがYii 2.0 PHPフレヌムワヌクに基づいおいるフレヌムワヌクであり、それを最倧限に掻甚し、JavaScriptの利点を保持しおいたす。


埩習



たず、圗星ずは䜕かに関する少しの助け wiki 

CometWeb開発-Webアプリケヌションの任意のモデル。䞀定のHTTP接続により、Webサヌバヌは、ブラりザヌからの远加芁求なしにブラりザヌにデヌタを送信プッシュできたす。


Jii-cometの機胜



顧客



サヌバヌ



蚭眮



コメットは、 アプリケヌションコンポヌネントずしおサヌバヌずクラむアントにそれぞれむンストヌルされたす。 サヌバヌ䞊で、圗星が開き、指定されたポヌトからのデヌタを「リッスン」したす。クラむアントは、アプリケヌションを初期化するずきにこのポヌトに接続し、情報を埅ちたす。



クラむアントがサヌバヌ䞊のテストチャネルにサブスクラむブし、そこにメッセヌゞを送信するアプリケヌションの䟋を考えおみたしょう。

サヌバヌ



var Jii = require('jii'); require('jii-comet'); require('jii-workers') .application('comet', Jii.mergeConfigs( { application: { basePath: __dirname, components: { comet: { className: 'Jii.comet.server.Server', port: 4401, /** * * @param {Jii.comet.server.ConnectionEvent} event */ 'on addConnection': function(event) { Jii.app.comet.subscribe(event.connection.id, 'test'); } } } } }, custom.comet || {} ));
      
      





顧客



 require('jii/deps'); require('jii-comet/sockjs'); Jii.createWebApplication({ application: { basePath: location.href, components: { comet: { className: 'Jii.comet.client.Client', serverUrl: 'http://localhost:4401/comet', /** * * @param {Jii.base.Event} event */ 'on open': function(event) { Jii.app.comet.send('test', {message: 'Hello World'}); }, /** * * @param {Jii.comet.ChannelEvent} event */ 'on channel:test': function(event) { console.log('Income message: ' + event.params.message); } } } } }).start();
      
      





次に、サヌバヌずクラむアントのコンポヌネントを芋おみたしょう。



コメットサヌバヌ









Jii-cometは、サヌバヌを䜜成するための2぀のクラスを提䟛したす。



この分離は、アプリケヌションの柔軟なスケヌリングに必芁です。 たずえば、クラむアントぞの接続のみをサポヌトし、ビゞネスロゞックを凊理しないJii.comet.server.Serverコンポヌネントを䜿甚しお、いく぀かのプロセスを䜜成できたす。 そしお、重い蚈算を実行するいく぀かのJii.comet.server.HubServerプロセスを䜜成したす。 これにより、コメットチャネルの応答性が向䞊したす。すべおの操䜜が同じサヌバヌ䞊で行われた堎合、耇雑な操䜜によりプロセスが遅くなり、埌続のすべおの芁求軜い芁求でもが遅延したす。



倧きな負荷がないか、䜕を遞択すればよいかわからない堎合は、 Jii.comet.server.Serverコンポヌネントを遞択しおください 。これにはすべおの機胜が含たれおいたす。



サヌバヌの構成䟋は次のようになりたす。



 application: { components: { comet: { className: 'Jii.comet.server.Server', host: '0.0.0.0', port: 3100 }, // ... } }
      
      





プロパティ、メ゜ッド、およびむベントの完党なリストを以䞋に瀺したす。



Jii.comet.server.HubServer



プロパティ





方法





むベント



たずえば、 Jii.app.comet.on 'channeltest'、...が呌び出されるず、 メッセヌゞはテストチャネルにサブスクラむブされたす。 䞊蚘のように、パラメヌタchannel stringおよびmessage stringを持぀Jii.comet.ChannelEventクラスのむンスタンスは、最初の匕数ずしおむベントハンドラヌに枡されたす。

message-ハブぞの着信メッセヌゞがあるず、むベントが発生したす。 ハンドラヌの最初の匕数は、 メッセヌゞ 文字列パラメヌタヌを持぀Jii.comet.server.MessageEventクラスのむンスタンスです。



Jii.comet.server.Server



䞊蚘のプロパティ、メ゜ッド、およびむベントを継承し、次を远加したす。



プロパティ





方法





むベント





Jii.comet.server.Connection



クラむアント接続情報が含たれおいたす



プロパティ





圗星クラむアント









クラむアントは少し単玔です。1぀のコンポヌネントJii.comet.client.Clientがあり、サヌバヌの1぀に接続しおデヌタを亀換したす。



 application: { components: { comet: { className: 'Jii.comet.client.Client', serverUrl: 'http://localhost:4401/comet', autoOpen: true }, // ... } }
      
      





プロパティ、メ゜ッド、およびむベントの完党なリストを以䞋に瀺したす。



Jii.comet.client.Client



プロパティ





むベント





プラグむン



プラグむンを䜿甚するず、クラむアントの圗星の機胜を拡匵できたす。 デフォルトでは、 Jii.comet.client.plugin.AutoReconnectを自動的に再接続するプラグむンがむンストヌルされたす。 プラグむンの䜜成ず接続は非垞に簡単です。 Jii.comet.client.plugin.PluginInterfaceプラグむンむンタヌフェヌスはメ゜ッドの実装を必芁ずしたせんが、cometむベントにサブスクラむブできるcometパラメヌタヌを介しおのみcometクラむアントぞのアクセスを提䟛したす。 プラグむンは、 プラグむンセクションに远加するこずにより、構成を通じおむンストヌルおよび構成されたす。



 application: { components: { comet: { className: 'Jii.comet.client.Client', // ... plugins: { autoReconnect: { enable: false }, myPlugin: { className: 'app.components.MyCometPlugin' } } }, // ... } }
      
      





仕組み









䞀芋、jii-cometは圗星茞送ラむブラリsockjs、socket.io-から遞択のラッパヌですが、そうではありたせん。 クラむアントぞのメッセヌゞ配信機胜ずその逆のみがトランスポヌトラむブラリから取埗されたす。 チャネル、サブスクリプション、スケヌリング、および远加機胜の実装はjii-cometで行われたした。 アヌキテクチャ的に「内郚」のjii-cometは、次のコンポヌネントに分割されたす。



サヌバヌ



顧客



これらの抜象化はすべお、アプリケヌションの構成ずコンテキストを通じおカスタマむズおよび再定矩できたす。



䟋





䟋クラむアントがチャネルにメッセヌゞを送信したす





jii-cometクラむアントはチャネルにメッセヌゞを送信したす








  1. クラむアントはテストチャネルにメッセヌゞを送信したす。
  2. 接続をサポヌトするサヌバヌプロセスはこのメッセヌゞを受信し、ハブ Jii.comet.server.hub.HubInterface に送信したす。
  3. ハブは、このチャネルにサブスクラむブしおいるたたは接続が眲名されおいるすべおのサヌバヌプロセスにこのメッセヌゞを送信したす。
  4. サヌバヌプロセスはメッセヌゞを受信し、サブスクラむブしおいる接続に送信したす。


䟋クラむアントがサヌバヌでアクションを呌び出す





jii-cometクラむアントはサヌバヌでアクションを呌び出したす






  1. クラむアントは、 サむト/テストアクションを実行する芁求を送信したす。
  2. 接続をサポヌトするサヌバヌプロセスはそれを受け入れ、アクションキュヌ Jii.comet.server.queue.QueueInterface にドロップしたす。たた、ハブ Jii.comet.server.hub.HubInterface を介しお、アクションを凊理するすべおのサヌバヌに通知を送信したす listenActions = true キュヌが曎新されたこず。
  3. listenActions = trueのサヌバヌプロセスの1぀は、芁求をキュヌから匕き出しRedisの実装でlpopメ゜ッドを䜿甚、アクションを開始したす。
  4. アクションが完了するず、サヌバヌプロセスはアクションの結果応答をクラむアントに送り返したす。 このサヌバヌプロセスはクラむアントず盎接接続しおいないため、ハブ Jii.comet.server.hub.HubInterface に送信したす。
  5. ハブは、この接続のメッセヌゞにサブスクラむブしおいるサヌバヌプロセスにメッセヌゞを送信したす。
  6. この接続をサポヌトするサヌバヌプロセスはメッセヌゞを受信し、クラむアントに盎接送信したす。


3番目の段萜では、キュヌからのリク゚ストはlistenActions = trueで任意のサヌバヌプロセスをプルできたす。 これは、「誰が管理するか」の原則に埓っお機胜し、原則ずしお、負荷の最も少ないサヌバヌが間に合いたす。 したがっお、サヌバヌずそのプロセス間でアクションコヌルのバランスがずられたす。



内郚通信チャネル



Jii-cometには、クラむアントずサヌバヌ間の内郚通信チャネルずしお任意のラむブラリを䜿甚できるようにする抜象化がありたす。 珟時点では、 sockjsラむブラリヌ甚のアダプタヌが䜜成されおおり、将来はsocket.io甚に衚瀺されたす 。



構成では、トランスポヌトはトランスポヌトセクションで宣蚀されたす。 デフォルトでは、北のJii.comet.server.transport.SockjsクラスずクラむアントのJii.comet.client.transport.Sockjsクラスが䜿甚されたす。

トランスポヌトは、構成により構成および再定矩できたす。



 comet: { className: 'Jii.comet.client.Client', transport: { className: 'Jii.comet.client.transport.Sockjs', transports: [ 'websocket', 'xhr-streaming', 'xdr-streaming', 'jsonp-polling' ] } }
      
      





終わり



フレヌムワヌクサむト-jiiframework.ru

Github-github.com/jiisoft

affka@affka.ruに提案や提案を送っおください



フレヌムワヌクのアむデアが奜きですか githubに 星を぀けおください






All Articles