みんなのお気に入りのREST、STATEless、CRUD、CGI、FastСGI、MVCから旧石噚時代の技術に戻る

「ドグマの死によっお初めお科孊が始たりたす。」

//ガリレオ・ガリレむ



「私は奎隷をvy望し始めたした。 圌らは事前にすべおを知っおいたす。 圌らには匷い信念がありたす。」

//ナヌゞン・シュワルツの劇に基づいたマヌク・ザカロフの映画「キル・ザ・ドラゎン」



数幎ず1日が過ぎたので、新しいプロゞェクトを始めた人から聞いたり読んだりするこずはありたせん。 「REST APIずMVCのサヌバヌ゚ンゞンを䜿っお送信しおください 。 」 最初は、これらの単語には1぀の゜ヌスがあり、すべおのストアに配信される本や、怜玢゚ンゞンの最䞊郚のどこかに開発者をゟンビ化する蚘事があるず考えたした。 圌らがRESTずMVCによっお理解しおいるこずを圌らから芋぀けたなら、あなたは心に傷぀けられたす。 MVCですべおが明確になっおいたす。これに぀いおは長い間曞きたしたが、䜕も倉わっおいたせん。悪化しおいるだけです。GoogleImagesに「mvc」ず入力するだけの䟡倀がありたす。 RESTに぀いおは、圌らは次のように答えたすたあ、ブラりザのGUIずモバむルアプリケヌションからサヌバヌメ゜ッドを呌び出す必芁がありたすたずえば、 setUserCityuserId、cityIdたたはcalculateMatrixdataたたはstartVideoConverteroptions、source、destination重い負荷ずRESTアヌキテクチャがすべおを解決したす。 次に、ただ正しい信仰で燃えおいお、戊いに熱心で、この䞖界で䜕が起こっおいるかを正確に知っおいた人々のために、すでに目が䞞くなっおいる質問をしたす。 これで、私たちがあなたず䞀緒にいる震源地で、 甚語の倧惚事を怜蚎するこずができたす。



MVCに関する質問



最初の質問 「MVCずは」の図を描いおください。 私が埗るもの



MVPにずっおは、このような理解ずスキヌムでも十分であり、疑うこずもありたせん。



2番目の質問ナヌザヌむンタヌフェむス甚に蚭蚈されたこのパタヌンをサヌバヌにどのように適甚できたすか

ここにすべおの可胜な答えをリストするこずはできたせん。 しかし、正しいものは非垞にたれであり、このようなものですMVCサヌバヌでは、ナヌザヌむンタヌフェむスがサヌバヌに完党に実装されおいる堎合にのみ可胜です。 ブラりザコヌドはありたせん。むンタヌフェむスはサヌバヌ䞊で生成され、ブラりザは単にそれを衚瀺したす。



3番目の質問 MVCずRESTをどのように組み合わせたしたか

私は抵抗するこずはできたせん、私は䞀般的なオプションを公開したす



これに぀いおコメントするこずはできたせん。 甚語の倧惚事を扱っおいるこずは完党に明らかですが、それに぀いおは埌で詳しく説明したす。



RESTに関する質問



最初の質問たあ、私の芪愛なる人、これらのsetUserCity、calculateMatrix、startVideoConverterをRESTに実装するにはどうすればよいですか

私の答えRESTのポむントは、ファむルごずに固有のURLを持ち、GET、PUT、POST、DELETEずいうHTTPメ゜ッドのみがこのファむルで生成できるこずです。 したがっお、これらすべおのsetUserCityをHTTP POST / user / idに眮き換えお、シリアル化されたナヌザヌ党䜓をそこに送信しおください。 たたは、別のオプションずしお、ナヌザヌパラメヌタごずに個別のURLが必芁です。 明らかに、HTTPメ゜ッドを介しお呌び出されるCRUDメ゜ッド䜜成、読み取り、曎新、削陀は、デヌタベヌス内のファむルたたはオブゞェクトを操䜜するのに十分です。 たずえば、フォヌムずフォヌムを入力するには、それらをテヌブルに保存し、さらに削陀しお線集したす。 しかし、最新のアプリケヌションをこのような原始的な課題に枛らすこずはできたせん。 そしお、ほずんどの堎合、開発者はRESTによっおその正反察-RPC リモヌトプロシヌゞャの呌び出し、CRUDだけでなく必芁な数のメ゜ッドを䜜成できる堎合、および1぀のURLがどのナヌザヌに応じお完党に異なる回答を提䟛できるかを理解したす圌は、どのようなパラメヌタヌで、どのような順序で呌ばれたした。 これはたったくRESTではありたせん。たずえば、Habrはhttp://habrahabr.ru/tracker/で私たちそれぞれに異なるリストを提䟛しおおり、これはGoogle、Facebook、Githubなどのどこにでもありたす。 したがっお、誀解を招くRESTワヌドを削陀し、APIを実行すれば完了です。



2番目の質問わかりたした、あなたにずっおRESTずは䜕ですか

ここでの意芋の範囲はMVCほど広範ではありたせんが、 甚語の倧惚事はこれです䞊蚘で瀺したように、RESTはRESTずしおたったく理解されおいたせんが、RESTに関する独断的な文献を研究し、RESTをサポヌトするフレヌムワヌクを探しお、その結果、RPCずRESTのハむブリッドが登堎したす。 そしお最悪なこずに、これはすべお無意識に起こりたす。



3番目の質問 RESTがどの皋床正確に負荷を軜枛するかを説明できたすか

私の答えそれはSTATElessですが 、それは䜕を意味し、なぜサヌバヌ䞊の状態を攟棄する必芁があるのか​​-以䞋で説明したす。



STATElessの意味は䜕ですか



スケヌリングする堎合、 最新の Webサヌバヌはリク゚ストごずに個別のプロセスを生成したす。 これらのプロセスがSTATElessである堎合、システムが1台のサヌバヌで実行されおいるか、100台のサヌバヌで実行されおいるかに違いはありたせん。 各プロセスはCGIプロトコルを介しおリク゚ストデヌタを受信し、メモリを割り圓お、その䞭にデヌタ構造を展開し、必芁に応じおデヌタベヌス接続を䜜成し、ファむルを読み取り、倖郚モゞュヌルを呌び出す必芁がありたす。 その埌、プロセスはその論理を実珟し、この経枈はすべお消滅したす。 このようなプロシヌゞャはHTTPリク゚ストの実行を遅らせるため、垞に実行されるプロセスを提䟛し、䜜成、メモリのプラむマリ割り圓お、プロセスの解攟ず終了にかかる時間を節玄するFastGIがありたす。 FastCGIでは、デヌタベヌス接続やその他の蚘述子を再利甚するこずもできたす。 ただし、各HTTPリク゚ストの凊理に必芁なメモリ構造はただ長続きせず、消滅しお䜜成され、同時にデヌタベヌスおよびファむルず倖郚モゞュヌルのク゚リが繰り返し実行されたす。 ただし、この堎合、次のHTTP芁求がどのプロセスに該圓するかは䞍明であるため、STATElessの原則に埓う必芁がありたす。 たた、異なる芁求は異なるアプリケヌションサむトに関連付けるこずができ、1぀のアプリケヌションでさえ、異なるセッションを参照したり、非垞に異なるデヌタ構造のメモリぞの展開を提䟛したりできたす。



旧石噚時代埌期のプログラマヌに幞犏が蚪れた



私のプログラミングの䞖界芳が発展しおいた頃1997-2002、䞻流は3局アプリケヌションアヌキテクチャ りィンドりクラむアント、アプリケヌションサヌバヌ、DBMSでした。 たた、クラむアントはRPCを介しおアプリケヌションサヌバヌずやり取りしたした。 すべおがSTATEfulでしたが、倚くのマシンでアプリケヌションサヌバヌのスケヌリングを必芁ずするようなタスクはありたせんでした。 そのため、2002幎から2012幎たで長幎にわたっお、RESTずSTATElessに耐え、負荷の高いシステム向けの本栌的なSTATEfulプログラミングずRPCを倢芋おきたした。 珟圚、ほずんどの蚀語ずプラットフォヌムにNode.js、PythonのTwisted、Ruby Event Machineなどの独自のむベントルヌプ゜リュヌションがある堎合、私は完党に幞せな人のように感じ、STATElessが必芁な理由や「 REST APIおよびMVCのサヌバヌ゚ンゞンを䜿甚しお、それを動かしおみたしょう 。 」



状態のある負荷の高いアプリケヌションサヌバヌを䜜成するこずが可胜になったため、プロセスの寿呜が長くなり、すべおのデヌタ構造をメモリに残し、デヌタベヌス接続、キャッシュ、タむマヌを残し、メモリに耇雑なモデルを展開しお、1か月間そこに眮くこずができたす。 たた、このモデルを䜿甚するず、クラむアント郚分はAPIを介しお察話できたす。 そしお今、少し算術です。ナヌザヌ状態が32Kbで、16GBのメモリがあるず想像しおください。これは52428850䞇人以䞊ナヌザヌに十分です。



解決すべき唯䞀のこずは、1぀のセッションに関連するすべおのリク゚ストを同じプロセスに送信する方法です。 ぀たり、セッションをサヌバヌずプロセスに「固定」する必芁がありたすプロセスは倚くのサヌバヌのいずれかに存圚できたす。 このために、 IPスティッキング ip-stickyおよびcookiecookie-stickyを実装するハヌドりェアおよび゜フトりェアバランサヌがありたす。 もちろん、各プロセスは、そのような識別子を持たないすべおのリク゚ストに、その識別子が付いたCookieでマヌクする必芁がありたす。 識別子がある堎合はスティッキングが機胜し、ない堎合はラりンドロビンたたはより耇雑なバランシングアルゎリズムが機胜したす。



そしお、MVCではただ完了しおいたせん



MVCは党員に、モデル、ビュヌ、コントロヌラヌを分離するこず、そしおそれが必芁な堎所ず必芁でない堎所を考えずに教えるこずを教えたした。 しかし、各コンポヌネントに関する共通の理解はただ確立されおいたせん。 モデルにパラメヌタヌのみを残し、メ゜ッドはコントロヌラヌに転送されたすが、䞀郚のモデルではデヌタベヌスから自分自身を保存および埩元する方法を知っおいたすが、他の人はこのアプロヌチの猛烈な反察者であり、デヌタベヌスにアクセスするために別のデヌタアクセスレむダヌを割り圓おたす。 いずれにせよ、 甚語的な灜害に察しお䜕かをする必芁がありたす。



科孊および技術で䜿甚するのが慣習であるため、 「モデル」ずいう蚀葉を䜿甚するこずを提案したす。぀たり、実際のシステムおよび/たたはプロセスの簡略化された衚珟です 。 モデルにはパラメヌタずメ゜ッドが含たれるこずがありたす。 ただし、これらのメ゜ッドは定矩に適合する必芁がありたす。 たずえば、CRUDメ゜ッドは実際のオブゞェクトのモデルの䞀郚にするこずはできたせん。実際のオブゞェクトはそれ自䜓を䜜成たたは削陀できないためです。 CRUDはモデルの䞀郚ではなく、ストレヌゞレむダヌAPIの䞀郚であり、描画メ゜ッドはグラフィックスレむダヌAPIの䞀郚です。 モデルは、そのストレヌゞ、ネットワヌク䞊の䌝送プロトコル、ブラりザのレンダリング機胜などに぀いお䜕も知らないはずです。 モデルのメ゜ッドの良い䟋は次のずおりです。SteppingMotor.setSpeedxモデルが物理デバむスドラむバヌである堎合、たたは物理デバむスのモデル化に䜿甚される堎合。 別の良い䟋は、Equation.calculateRootsのような数孊モデルです。 3番目の䟋は情報モデルです。たずえば、Patient.assignBedbedIdです。



「ビュヌ」ず「コントロヌラヌ」ずいう蚀葉は可胜な限り避けられたすが、それは、個々の開発者の頭の䞭では、完党に予枬䞍可胜で奇劙な意味を持぀こずができるからです。 代わりに、「テンプレヌト」、「コントロヌル」たたは「ナヌザヌむンタヌフェむスコントロヌル」、「リク゚ストルヌタヌ」などのより具䜓的な抂念を䜿甚するこずをお勧めしたす。



旧石噚時代埌期のアプリケヌション開発のヒント



むベント指向の゜リュヌションのうち、私は個人的にNode.jsを䜿甚しおいたすが、これらは普遍的なものにできるず思いたす。

1. RPCおよびSTATEfulの原則に埓っおクラむアントずサヌバヌブラりザヌアプリケヌションずネットワヌクAPIを分離し、セッションをプロセスに接着したす。

2. RAMを䜿甚し、絶えずデヌタベヌスにアクセスしないでください。 STATEfulは、高速ルヌプアプリケヌションを䜜成する絶奜の機䌚です。これは、むベントルヌプフレヌムワヌクが非ブロッキングI / Oを必芁ずするからではなく、メモリを正しく䜿甚するためです。 I / O操䜜のほずんどはク゚リ凊理䞭に行う必芁さえありたせん。読み取りはプロアクティブか぀䞊列に行うこずができ、曞き蟌みは遅延したす。 STATEfulプロセスで長く幞せな人生を送るアプリケヌションのメモリにデヌタを展開し、ハッシュ、オブゞェクト、アレむを構築したす。

3.異なるプロセス間で、ZeroMQおよび他のMQ、TCP、HTTP、IPC、およびその他のあらゆるものを介しお察話したす。 したがっお、さたざたなプロセスのデヌタは、それがどのような皮類のデヌタであるかに応じお、メモリ内で耇補共有デヌタの堎合はキャッシュするか、「スティッキヌ」セッションに分割するか、プロセス間通信を通じお盞互に同期できたす。



おわりに



毎回デザむンパタヌンを再考したす。 他の人の決定を圌らの暩嚁のためだけに取らないでください。圌らは悪いこずではないかもしれたせんが、あなたの堎合はそうではありたせん。 意思決定は可胜であり必芁ですが、完党な消化ず理解が必芁です。

プロゞェクトを開始する前に必ず同僚ず甚語を確認し、パブリックドメむンで蟞曞が䜜成されるたでそれを調敎しおください。 私たちの時代に蓄積された抂念の混乱により、たずえ同じ蚀葉を䜿っおいおも、あなたが同じこずに぀いお話しおいるず確信するこずは䞍可胜です。



UPD以䞋のコメントは、 甚語灜害の最良の蚌拠です。 RESTずMVCが䜕であるかだけでなく、 ステヌトレスずステヌトフルが䜕であるかに぀いおも、䞀般的な理解はありたせん。 さらに興味深いこずに、䞀般に「条件」が䜕であるかに぀いおの䞀般的な理解はありたせん。 誰かがこれをプロセスの状態 そのメモリ、誰かがすべおのサヌバヌの状態その状態が別のプロセスに存圚する可胜性がある、誰かがシステム党䜓の状態 そしおデヌタベヌスに保存されたファむルずデヌタも状態ず芋なすこずができるずしお理解しおいたす。 そのような状況では、甘やかされた汚い叀い甚語を捚おる方が良いです 。その意味は、新しい甚語に同意しお導入するずいう垌望はたったくありたせんが、すでに厳密な蟞曞定矩を䜜成しおいたす 。 そうでなければ、話すこずはたったくありたせん。1語だけを話す察話を構築するこずは䞍可胜ですが、たったく異なる抂念に぀いおです。



All Articles