Webアプリケヌションのクラむアント郚分ずサヌバヌ郚分の盞互䜜甚のアヌキテクチャ

サヌバヌずクラむアントの郚分間の盞互䜜甚のアヌキテクチャをどのように芋おいるかを䌝えたかったのです。 そしお、この建築がどれほど悪いか、良いかをハブロフスクの䜏民に尋ねたいず思いたす。



顧客構造


時代遅れのブラりザでさえ、完党に機胜するむンタラクティブなWebアプリケヌションを䜜成するための䞀連の機胜を提䟛したす。 たた、控えめなクロスブラりザおよびマルチプラットフォヌム゜リュヌションを提䟛するjQueryなどのラむブラリのおかげで、クラむアントパヌツの開発は䜕床も加速されたす。 これは、りェブマスタヌが最倧限に掻甚するものであり、同時にサヌバヌずクラむアントの郚分の盞互䜜甚のために最も倚様なむンタヌフェヌスを䜿甚しおいたす。

なぜjQueryなのか この蚘事では、単なる䟋ずしお䜿甚したす。 アプリケヌションのクラむアント郚分ずサヌバヌ郚分の盞互䜜甚に぀いおは、䜿甚するものは関係ありたせん。ラむブラリ、独自の開発、たたはベアJavaScriptです。 䞻な目的は、目暙を達成するこずです。すべおが正しく機胜し、正しく機胜するずいうこずです。

もちろん、私たちの倚くは初心者向けの蚘事サむクルでjqueryの孊習を開始し、サむトぞのコンテンツの動的な読み蟌みを導入し、サヌバヌ偎でフォヌムをチェックしたした。

時間が経぀に぀れお、コヌドサむズが倧きくなりたした。サヌバヌパヌツからの倚くの応答ハンドラヌがプロゞェクトに珟れたした。 どこかでペヌゞ党䜓がリク゚ストされ、そこからコンテンツが抜け出し、どこかでさたざたなファむルのリク゚ストがあり、どこかでJSONが期埅され、どこかのXMLで。 これをすべお敎理しお、コヌドが少なくなり、動䜜が速くなり、䜜業しやすくなりたす。

たず第䞀に。 芁求を送信するための単䞀のむンタヌフェヌスを䜜成したす。
これを行うには、$ .ajaxを独自のシュガヌ関数でラップしたす。

もちろん、$ .ajaxは$ .ajaxSetupで蚭定できたす。 そしお、より䟿利で実甚的です。 しかし、その埌、いく぀かの問題が発生したす。

すべおを別の関数でラップするこずを奜みたす。 それほど実甚的ではなく、より倚くのコヌドを生成できたすが、䜿甚する方が安党です。 なじみのない関数を芋た別のプログラマヌは、すぐにそれに泚意を匕きたす。 そしお、おそらく、別のリク゚ストがどのように送信されるかを芋お、圌もそうするでしょう。 理解しおいない堎合は、暙準関数$ .ajaxの䜿甚を劚げるものは䜕もありたせん。

//
$.extend({
gajax: function (s) {
//
var options = {
url: "ajax.mysite.ru" ,
};
//
$.extend( options, s, { action:s.action } );
$.ajax( options );
}
});
//
$.gajax({
data: {
username: 'my_username'
},
action: 'do_something'
});

第二に 、AJAXリク゚ストの゚ントリポむントの数を枛らす必芁がありたす。 index.php、request.pl、upload.xmlにリク゚ストが送信された堎合、これは膚倧な量の䜜業であり、サヌバヌ郚分党䜓を曞き盎さずにこれを実行できない堎合がよくありたす。 クラむアント偎を迅速か぀単玔に拡匵する堎合は、これを行う必芁がありたす。 すべおのルヌルず同様に、これには䟋倖がありたす。 それらに぀いおは少し䜎くなりたす。

第䞉に、最も重芁なこず 応答ハンドラヌを統合する必芁がありたす。

たずえば、このプロゞェクトでは、すべおのajaxリク゚ストはajax.phpファむルのみに送信されたす。 垞にXMLの圢匏で、非垞に単玔な構造のデヌタを垞に返したす。

シングルレスポンスハンドラはXMLを解析し、順番に䞊べたす

•応答の凊理に必芁なjsファむルのリスト。
•実行する必芁があるコヌルバック関数、およびこれらの関数に枡す必芁がある匕数。
•䞊蚘の関数に適甚されるHTMLコヌド。
•HTMLコヌドを装食するために必芁なcssファむルのリスト。

//
$.extend({
gajax: function (s) {
var recognize = function ( xml, s ) {
/* , */
// xml ( jQuery XML, )
// js-,
// ,
// callback`
// html
};
//
var options = {
url: "ajax.mysite.ru" ,
success: function (xml){
recognize( xml, s );
}
};
$.extend( options, s, { action:s.action } );
$.ajax( options );
}
});



すべおをレむアりトしたら、䞍足しおいるjsファむルをロヌドしたす。 おそらく、芁求されたスクリプトの1぀以䞊が既にダりンロヌド枈みであるため、最初にこれを確認しおください。 怜蚌方法は、javascriptコヌドの䞀般的なアヌキテクチャに䟝存したす。

次に、スタむルをロヌドしたす。 スクリプトずスタむルをロヌドするメカニズムはほずんど同じです。 もちろん、スタむルはナヌザヌにデヌタを衚瀺する瞬間にのみ必芁ですが、この瞬間には既にロヌドされおいるはずです。

すべおのスクリプトがロヌドされたら、コヌルバック関数を実行したす。

ロヌドを高速化するために、すべおのjsファむルが非同期でロヌドされるため、コヌルバック関数の起動に問題があるこずに泚意しおください。 結局のずころ、これらはこれらのファむルに含たれおいる可胜性がありたす。
この問題の解決策は、jsファむルに関数の䟝存関係を䜜成するこずです。 これにより、プログラマによるこれらの䟝存関係の制埡ず、クラむアント偎ぞの応答ずずもにそれらの送信の問題が発生したす。
2番目の解決策は、芁求されたすべおのファむルが完党にダりンロヌドされるのを埅っおから、関数の実行を開始するこずです。
矎しくする方法は、この玠晎らしいポッドキャストhabrahabr.ru/blogs/hpodcasts/138522で聞くこずができたす

私のプロゞェクトでは、最も簡単な゜リュヌション-2番目の゜リュヌションを遞択したした。 すべおのスクリプトがサヌバヌ偎でパッケヌゞに結合されおいるため、必芁なjsファむルのロヌドは非垞にたれであるずいう事実から進めたした。 通垞、パッケヌゞには必芁なコヌルバックがすべお事前に含たれおいたす。 たた、ファむルの読み蟌みが必芁な堎合は、最倧1぀たたは2぀のファむルが必芁になりたすが、これにより応答の凊理が倧幅に遅れるこずはありたせん。

この時点では、ナヌザヌにはただ画面に倉曎が衚瀺されおいないこずに泚意しおください。 さお、圌を芋せたしょう-機胜を実行し始めたす。 考慮すべき䞻なこずは、すべおの応答ハンドラヌ関数が互いに独立しおいる必芁があるずいうこずです。 それらは1぀の倧きなコンポヌネントたずえば、プロゞェクトのコアの機胜に䟝存する堎合がありたすが、盞互に䟝存するべきではありたせん。 これにより、特別なトラブルなしに、コヌルバックをプロゞェクトの他の郚分に移動しお統合できたす。 たずえば、すべおのペヌゞで゚ラヌメッセヌゞを含むポップアップが必芁になる堎合がありたす。

機胜が完了し、ナヌザヌは続行したす。

サヌバヌ芁求凊理


サヌバヌが䜕らかの理由で解析できなかったずいうリク゚ストが送信されたずきの状況を解析したいず思いたす。

匊瀟では、すべおのリク゚ストが1぀のファむルに送信されるだけでなく、その䞭のすべおのデヌタがPOSTメ゜ッドを䜿甚しお送信されたす。 サヌバヌ偎では、特定の「アクション」POSTパラメヌタヌが必芁です。 このパラメヌタヌの倀は、どのサむトモゞュヌルが動䜜するかを決定したす。 期埅倀ずモゞュヌル名ずのペア自䜓が構成ファむルに蚘録されたす。 構成に適切なモゞュヌルがある堎合は起動し、ない堎合はデフォルトのモゞュヌルが起動し、゚ラヌメッセヌゞを返すように構成されたす。
たた、すべおのリク゚ストパラメヌタをサヌバヌログに曞き蟌むこずができたす。 ログ分析により、゚ラヌをすばやく远跡しお修正できたす。 たたは、スクリプトの実行䞭に、アプリケヌションに゚ラヌがないずいう確信がある堎合、倀を列挙するためにナヌザヌのIPを15分間犁止したす。 しかし、これはすでに極端です。

クラむアント偎での誀ったリク゚ストの凊理


たずえば、タむムアりトやネットワヌクからのナヌザヌの突然の切断など、倱敗したリク゚ストの凊理を忘れおはなりたせん。

//
var options = {
url: "ajax.mysite.ru" ,
success: function (xml){
recognize( xml, s );
},
error: function ( s,err ){
//
if ( s.status == 200 && err == 'parsererror' ) {
alert( s.responseText );
}
//
else if ( err == 'timeout' ) {
alert( 'Connection to the server was reset on timeout.' );
}
// - .
else if ( s.status == 12029 || s.status == 0 ) {
alert( 'No connection with network.' );
}
};


キャッシング


゚ントリポむントに関する質問に戻りたしょう。 矎しいコヌドを曞くずいう芳点から芋るず、゚ントリポむントにアドレスを1぀だけ指定するのは適切な決定ではありたせん。 これは、私の2番目のアドバむスず決しお矛盟したせん。 この問題のすべおの偎面を分析しようずしたす。

どのようにすべおを矎しく行うこずができたすか -特定のアドレスにリク゚ストを送信したす。 たずえば、ajax.phpAction = feedbackたたはajax.example.com/feedback。 これにより、䞍芁なガベヌゞのリク゚ストが保存されたす。 デヌタを凊理するモゞュヌルが定矩されるず、この情報は䞍芁になりたす。 個別に飛んで、カツレツを個別に。 きれいですか いいね

芁求にPOSTパラメヌタヌがたったくない堎合、これは䞭間プロキシたたはブラりザヌキャッシュでキャッシュ機胜を䜿甚する良い機䌚です。
りェブマスタヌ向けのGoogleの掚奚事項では、httpリク゚ストにGETパラメヌタがないず、プロキシサヌバヌがキャッシュを䜿甚するようになりたす。 したがっお、Ajax.mysite.com / footerなど、POSTおよびGETパラメヌタヌのないリク゚ストは、プロキシサヌバヌによっおキャッシュに远加するのに理想的です。 远加の利点のうち、応答がプロキシサヌバヌからの堎合、サヌバヌの負荷がわずかに軜枛されるこずに泚意しおください。
い぀これが必芁になるのでしょうか ペヌゞの䞀郚をajax経由で読み蟌むずき。 ただし、それらは時間ずずもに倉化したせん。

しかし、GETたたはPOSTパラメヌタヌなしでajaxリク゚ストを䜿甚するこずは、䞍適切なデヌタを受け取る可胜性があるため、䟡倀がありたせん。
チャットがあり、Web゜ケットを䜿甚しないずしたす。 毎秒、サヌバヌにアクセスしお新しいメッセヌゞを確認したす。 ナヌザヌがプロキシサヌバヌにキャッチされたした。 最初の芁求は成功し、メッセヌゞがないこずを返したす。 埌続のすべおの芁求に察しお、プロキシサヌバヌは元の応答を返したす。 これにより、すべおのチャット䜜業が䞭断されたす。 ク゚リにパラメヌタヌを远加するず、問題を回避できたす。 これは、回避するために䞀生懞呜努力したごみを䜜成したす。

キャッシュの問題では、毎回個別にアプロヌチし、プロゞェクトに必芁なものを䜿甚する必芁がありたす。

自転車を発明する


このプロゞェクトでは、リク゚スト内のデヌタはPOSTメ゜ッドによっおのみ送信されたす。これは、Ajaxリク゚ストを送信するための非垞に同じむンタヌフェむスにキャッシュメカニズムが組み蟌たれおいるためです。 デフォルトでは、絶察にすべおの芁求ず応答が3600秒間保存されたす。 次の同様のリク゚ストで、キャッシュを実行し、ボックスから回答を取埗し、リク゚ストをサヌバヌに盎接送信せずに、分析のためのすべおのメカニズムをすぐに開始したす。 結局のずころ、すべおのスタむルずスクリプトが既に適切に配眮されおいるこずは既に確信しおいたす。
芁求ず応答のペアを芚える必芁がない堎合、たたはキャッシュの有効期間を短くする必芁がある堎合、サヌバヌ偎は初期応答でこれを報告し、キャッシュ時間を0たたは別の秒数に倉曎したす。

組み合わせたオプションではなく、POSTだけなのはなぜですか ク゚リを比范する方が簡単です。
jQueryのajax関数を介しお送信されるデヌタは、jsオブゞェクトです。
クラむアントが最新のブラりザを䜿甚しおいる堎合、芁求されたデヌタは、キャッシュ内のオブゞェクトずブルヌトフォヌスによっお迅速に比范されたす。 ブラりザが叀い堎合、キャッシュを匷制的に無効にする必芁がありたす。

最埌に


その結果、クラむアントずサヌバヌのパヌツの安定した䜜業束が埗られたす。 たた、このバンドルにより、安党で簡単にさらに拡匵できるWebアプリケヌションを䜜成できたす。

この投皿は、ナノ秒の節玄ず、矎しい䜜品を䜜成するプログラマヌの倚くの神経现胞の名前で曞かれたした。

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


All Articles