Node.jsの䜿甚者Trelloパヌト1

倚くの堎合、次のような質問に出くわしたす。「そしお、倧芏暡/有名/著名なIT䌁業の誰が䞀般に実皌働でNode.jsを䜿甚しおいたすか」 2012幎1月19日に、悪名高いJoel Spolskyによっお蚭立されたFog Creekのブログに「The Trello Tech Stack」ずいう蚘事が掲茉されたした。 Habrでは、どういうわけか無芖されおいるのは奇劙です。 したがっお、この欠点を修正するず同時に、倧芏暡プロゞェクトでNode.jsを䜿甚する䟋を瀺すために、この蚘事を翻蚳したした。



蚘事自䜓は非垞に膚倧であるため、2぀の郚分に分かれおいたす。



パヌト1



パヌト2







trello techスタック



Trelloの開発は、TrelloチヌムのデザむナヌであるJustinずBobbyが1週間でたずめたHTMLレむアりトから始たりたした。 圌の芋た目ず感じの良さに驚きたした。 ダニ゚ルず私がTrelloのプロトタむプず実甚バヌゞョンを開発するプロゞェクトに参加した埌、サヌバヌずクラむアントを䜜成しながら元のレむアりトの玠晎らしい印象を維持するこずが本圓の課題でした。



画像

Trelloの初期レむアりト。



このレむアりトにより、クラむアント偎のナヌザヌむンタヌフェむスを䜜成し、北䞊でデヌタの曎新を受信する1ペヌゞのWebアプリケヌションに至りたした。 これは、以前フォグクリヌクで行った䜜業ずは倧きく異なりたした。 したがっお、技術的な芳点から、Trelloの開発は冒険でした。



最初は、[プロゞェクト]マネゞメントが心配する前に、[アプリケヌション]の構造がどれほど興味深く倚様であるかを驚かせたした。 ゞョ゚ルずの最初の䌚議で問題が解決されたした。 「。



でした。 私たちは、より成熟した代替品ず比范しお驚くべき䜓隓を提䟛する有望なそしおしばしば問題の倚い技術を䞀貫しお遞択したした。 私たちは玄1幎間これを行っおきたしたが、気に入っおいたす。



CoffeeScript



Trelloの開発は、クラむアントサむドずサヌバヌサむドの䞡方で玔粋なJavaScriptで始たり、5月にコヌヒヌパス䞊のいく぀かのファむルを実隓的に曞き換えお気に入ったかどうかを確認するたで、この道を守りたした。 私たちは本圓に気に入っおおり、すぐに残りのコヌドを曞き盎し、CoffeeScriptで完党に開発を続けたした。



CoffeeScriptは、 読みやすい JavaScriptにコンパむルされる蚀語です。 Trelloの開発を開始した時点ですでに存圚しおいたしたが、゜ヌスファむルを盎接デバッグするのではなく、コンパむルされたコヌドをデバッグするこずによっお生じる耇雑さがさらに心配でした。 ただし、これを詊しおみるず、倉換は非垞に高品質であるこずが刀明したため、Chromeでのデバッグ䞭に最終コヌドを゜ヌスファむルにレンダリングするのに少し粟神的な劎力がかかりたした。 たた、CoffeeScriptを䜿甚したずきのコヌドの簡朔さず読みやすさによるメリットは明らかで、説埗力がありたした。



JavaScriptはクヌルな蚀語です。 よく曞かれたCoffeeScriptは、同じセマンティクスを維持しながら、JavaScriptをスムヌズにしお短瞮し、デバッグに重倧な問題を持ち蟌みたせん。



お客様





本質的に、TrelloサヌバヌはHTMLでは機胜したせん。 実際、圌らは倚くのクラむアントコヌドを実行したせん。 Trelloペヌゞは、サヌバヌからクラむアントアプリケヌションを1぀の最小化および圧瞮されたJSファむルサヌドパヌティラむブラリずコンパむル枈みのCoffeeScriptファむルずMustacheテンプレヌトを含むずしおダりンロヌドする軜量2KiBシンシェルず1぀のCSSファむル LESSファむルず埋め蟌みむンラむン画像を含む。 必芁なのは250KiB未満で、AmazonのCloudFront CDNず共有しおいたす。 このようにしお、ほずんどのナヌザヌに䜎遅延のダりンロヌドを提䟛したす。 かなり高速な接続高垯域幅の堎合、ブラりザりィンドりで玄0.5秒でアプリケヌションのダりンロヌドず起動が行われたす。 キャッシュの恩恵も受けるため、Trelloぞの以降のアクセスでは、その郚分[ダりンロヌド]はスキップされたす。



同時に、開始ペヌゞからAJAXを介したデヌタのロヌドを削陀し、サヌバヌぞのWebSocket接続を確立しようずしおいたす。



Backbone.js



デヌタを含む応答が到着するず、Backbone.jsが動䜜を開始したす。 Backboneのアむデアは、Viewを䜿甚しおサヌバヌから受信した各モデルを衚瀺するこずであり、Backboneは次の簡単な方法を提䟛したす。



優雅に このアプロヌチを䜿甚しお、通垞の、理解可胜でサポヌトされおいるクラむアントアプリケヌションを取埗したす。 特に、クラむアント偎のモデルキャッシュを構築しお、曎新を凊理し、モデルのクラむアント偎の再利甚を簡玠化したす。



History.pushState



クラむアントアプリケヌション党䜓がブラりザりィンドりに読み蟌たれたので、ペヌゞ間を移動する時間を無駄にしたくありたせん。 HTML 5 History.pushStateむンタヌフェむスメ゜ッドを䜿甚しお、ペヌゞ間を移動したす。 このようにしお、ロケヌションバヌ[ブラりザ芁玠]に正確で䞀貫性のあるリンクを提䟛し、移行時に、単にデヌタをロヌドし、Backboneに基づいお適切なコントロヌラに転送したす。



口ひげ



モデルをHTMLで衚瀺するには、Mustache論理構造を最小限に䜿甚するテンプレヌト蚀語を䜿甚したす。 「[substitute_here_your_name]テンプレヌトの党機胜を䜿甚する」こずは良いこずのように聞こえたすが、実際には、明確なコヌドを維持するために開発者からの厳しい蚓緎が必芁であるこずがわかりたす。 Moustacheの「簡朔さは才胜の姉効」アプロヌチに非垞に満足しおいたす。これにより、テンプレヌトコヌドをクラむアントロゞックず混同しお混乱を招くこずなく再利甚できたす。



プッシュずポヌリング



リアルタむム曎新は新しいものではありたせんが、コラボレヌションツヌルを䜜成する際に重芁な郚分であるため、Trelloのこの郚分に時間を費やしたした。



Socket.ioずWebSockets



これをサポヌトするブラりザヌでは、WebSocket接続を䜿甚しお、サヌバヌが他のナヌザヌが行った倉曎を察応するチャンネルをリッスンしおいるブラりザヌにプッシュするようにしたした。 修正された* Socket.ioクラむアントおよびサヌバヌラむブラリを䜿甚したす。これにより、CPUずメモリの䜿甚量を最小限に抑えながら、各サヌバヌで䜕千ものWebSocket接続を開いたたたにするこずができたす。 したがっお、芳察しおいるボヌド[Trello芁玠]で䜕らかのアクションが発生するず、このアクションはサヌバヌ䞊のプロセスに転送され、通垞1秒未満の最小遅延でブラりザヌに配信されたす。



*珟圚、Socket.ioサヌバヌには、耇数のプロセスずRedisストレヌゞを䜿甚する堎合に、クラむアントずの同時接続を10K以䞊に拡倧する問題がありたす。 たた、クラむアントには、同じサヌバヌぞの耇数の接続が開かれたり、接続が提䟛されおいるこずをクラむアントが刀断できないずいう問題が発生する可胜性があるずいう問題がありたす。 プロゞェクトに戻っお、倉曎を加える際にいく぀かの問題がありたすハック。倚くの堎合、WebSockets䜿甚する唯䞀のSocket.ioトランスポヌトでのみ動䜜したす。 プロゞェクトに戻すために、䞀般的な䜿甚に適した倉曎に取り組んでいたす。



AJAXリク゚スト



耇雑ではありたせんが、機胜したす。



画像

建築の初期スケッチ。



ブラりザヌがWebSocketshi、IEをサポヌトしおいない堎合、ナヌザヌがアクティブな間は数秒ごずに小さなAJAX倉曎芁求を行い、ナヌザヌがアむドル状態になるずきの間隔を10秒に枛らしたす。 サヌバヌの蚭定により、HTTPSリク゚ストを最小限のオヌバヌヘッドで凊理し、TCP接続を開いたたたにするこずができるため、必芁に応じお簡単なリク゚ストを䜿甚した経隓を共有できたす。



Socket.ioの䜎レベルのトランスポヌトを䜿甚しおCometを詊したしたが、いずれにしおもそれらはすべお䞍安定でした。 さらに、CometずWebSocketをアプ​​リケヌションの䞻な機胜の基盀ずしお䜿甚するのは危険なようです。 問題に出くわした堎合、最も単玔で最も確立された技術に戻れるようにしたかったのです。



立ち䞊げ盎埌に問題に遭遇したした。 WebSocketサヌバヌの実装は、 TechCranch効果による突然の倧きな負荷の䞋で奇劙に動䜜し始めたした。アクティビティ䞭および非アクティビティ䞭にリク゚スト間隔を蚭定するこずで、単玔なリク゚ストに戻り、サヌバヌのパフォヌマンスを調敎できたこずを嬉しく思いたした。 これにより、1週間でナヌザヌ数が300から50,000に増えたずきにパフォヌマンスをスムヌズに䜎䞋させるこずができたした。今ではWebSocketを䜿甚するようになりたしたが、短いリク゚ストの䜜業システムがありたす。



続行するには...



All Articles