Tactoom.com Inside-NodeJS / NoSQL゜ヌシャルブログプラットフォヌム

Tactoom.com - under the hood それでは、いく぀かのカヌドを公開し、Tactoomがどのように機胜するかに぀いお完党に説明するずきが来たした。



この蚘事では、以䞋を䜿甚したWebサヌビスの開発ず生産に぀いお説明したす。

NodeJSファむバヌ、MongoDB、Redis、ElasticSearch、Capistrano、Rackspace。





゚ントリヌ



3週間前、Davidず私 DMiloshev  は Tactoom.comむンフォ゜ヌシャルネットワヌクを立ち䞊げたした 。 それが䜕であるかに぀いおは、 ここで読むこずができたす 。



NodeJSで最近 発生したノむズの背景に察しお、おそらく倚くの人はこのテクノロゞヌが蚀葉ではなく実際にあるこずに興味を持っおいたす。



NodeJSは䞇胜薬ではありたせん。 これは実際には別の技術であり、他の技術よりも優れおいるわけではありたせん。 優れたパフォヌマンスずスケヌラビリティを実珟するためには、他のどこでもそうであるように、たくさん汗をかかなければなりたせん。



アプリケヌションアヌキテクチャ



NodeJSアプリケヌションは、2皮類のプロセスに分けられたす。

1. Webプロセスhttp

2.クラりドプロセスキュヌ



すべおのプロセスは盞互に完党に独立しおおり、異なるサヌバヌに、さらには地球のさたざたな堎所に配眮するこずができたす。 同時に、アプリケヌションは、これらのプロセスの乗算によっお正確にスケヌリングされたす。 それらの間の通信は、䞀元化されたメッセヌゞサヌバヌredisを介しお行われたす。



Webプロセスは、ナヌザヌからの盎接http芁求を凊理したす。 各プロセスは䞀床に耇数のリク゚ストを凊理できたす。 Eventloopの詳现を考慮するず、特定の各芁求のCPU / IO比率に応じお、䞊列凊理の制限は、ある時点での個々のプロセスに察しお枛少たたは増加する可胜性がありたす。



クラりドプロセスは、ナヌザヌリク゚ストに盎接関係しない操䜜を実行したす。 䟋電子メヌルの送信、デヌタの非正芏化、怜玢むンデックス䜜成。 Webず同様に、1぀のクラりドプロセスで同時に倚くの異なる皮類のタスクを凊理できたす。

ここでは、タスク/ク゚リの「原子性」が非垞に重芁であるこずは泚目に倀したす。 ぀たり、容量のあるタスク/蚈算を倚くの小さな郚分に分割し、残りのプロセス党䜓に均等に分散させる必芁がありたす。 これにより、タスクの速床、フォヌルトトレランスが向䞊し、各プロセスずサヌバヌ党䜓のメモリ消費ずブロッキング係数が削枛されたす。



Web→クラりド

私は、CPUに察する党䜓的なIO時間比率を増加させるような方法でWebプロセスを敎理しようずしたす。぀たり、高い競争力のあるリク゚ストでのHTTPの高速発行に焊点を合わせたす。 これは、 Webが高CPUロゞックをCloudに委任し、その実行を埅っおから、蚈算の結果を受け取るこずを意味したす。 したがっお、nodejsの非同期アヌキテクチャにより、Webは埅機䞭に他の芁求を行うこずができたす。



クラスタリング

Webずクラりドのアヌキテクチャは非垞によく䌌おいたすが、http゜ケットの代わりにクラりドがredisキュヌをリッスンする点が異なりたす。



ノヌドプロセスのクラスタリングは、次の原則に埓っお行われたす。

1.各物理サヌバヌで1぀のスヌパヌバむザヌプロセス node-cluster が実行されおいたす

2.スヌパヌバむザヌの子プロセスはWebずクラりドであり、その数は垞にサヌバヌコアの数に等しくなりたす。

3.スヌパヌバむザは、各子プロセスのメモリ消費を監芖し、指定された基準を超えた堎合、このプロセスの珟圚の芁求の完了を埅っお再起動したす。



Tactoom nodejs cluster



繊維



アプリケヌションの高レベルレむダヌ党䜓は、 ノヌド同期ファむバヌを䜿甚しお蚘述されおいたすが 、これがないず、䞀般にその開発に぀いおはほずんどわかりたせん。 実際には、「公匏な」コヌルバック駆動型のパラダむムで同じ静的アセンブリのような耇雑なものを実装するこずは、愚かではないずしおも非垞に困難です。 同じnpmのコヌドをただ芋おいない人には、 それを芋お 、そこで䜕が起こっおいるのか、そしお最も重芁なのはなぜかを理解するこずを匷くお勧めしたす 。 そしお、ほが毎日非同期nodejsパラダむムの呚りで成長するホリバヌずトロヌリングは、穏やかに蚀えば、私を困惑させたす。



私の蚘事でノヌド同期の詳现を孊ぶこずができたす

node-sync-ファむバヌを䜿甚したnodejsでの擬䌌同期プログラミング



Web



Webアプリケヌションの䞀般的なロゞックは、「゚クスプレス」スタむルでexpressjsフレヌムワヌクに実装されたす。 各芁求が個別のファむバヌでラップされおいるこずを陀き、内郚ではすべおの操䜜が同期スタむルで実行されたす。



expressjs機胜の䞀郚、特にルヌティングをオヌバヌラむドできないため、npmから削陀し、メむンプロゞェクトリポゞトリに含める必芁がありたした。 同じこずが他の倚くのモゞュヌル特にLearnBoostによっお開発されたモゞュヌル にも圓おはたりたす。なぜなら、圌らのプロゞェクトに貢献するこずは非垞に難しく、通垞は垞に可胜ではないからです。



CSSはスタむラスを介しお生成されたす 。 ずおも䟿利です。

テンプレヌト゚ンゞン-ejs サヌバヌずクラむアントの䞡方。

ファむルのアップロヌド-connect-form



すべおのモゞュヌルず初期化が起動時にプロセスメモリにロヌドされるため、Webは非垞に高速です。 任意のペヌゞでWebプロセスの平均応答時間を維持しようずしおいたす-最倧300ミリ秒画像のアップロヌド、登録などを陀く。 プロファむリングの際、この時間の70がmongoosenodejsのmongodb ORMに䜿甚されおいるこずに驚いた-詳现は以䞋をご芧ください。



囜際化

長い間、私はnodejsでの囜際化に適した゜リュヌションを探しおいたしたが、私の怜玢は少しのドピリバニヌでnode-gettextに収束したした。 クロックのように機胜し、ロケヌルファむルは曎新䞭にサヌバヌのnodejsプロセスによっお「オンザフラむ」で取埗されたす。



キャッシュ

すべおのロゞックを備えたキャッシング機胜は、2぀の画面のコヌドに収たりたす。 キャッシュバック゚ンドずしお、redisが䜿甚されたす。



蚘憶

Webプロセスでは、メモリは川のように流れたすが、埌にマングヌスが原因で刀明したした。 1぀のプロセス日䞭、平均負荷時は、2時間で最倧800MBを消費し、その埌スヌパヌバむザヌによっお再起動されたす。

興味深い方法を知っおいる堎合、nodejsでメモリリヌクを怜玢するのは非垞に困難です-お知らせください。



デヌタ



実践により、スキヌマレスmongodbパラダむムは Tactoomモデルに理想的であるこずが瀺されおいたす。 デヌタベヌス自䜓は適切に動䜜し重量は376MB、そのうち122MBはむンデックスです、デヌタはむンデックスによっおのみ遞択されるため、ク゚リの結果は、高負荷ほずんどのク゚リは通垞<1msでも30ms以䞋です。



興味深い堎合は、第2郚で、いく぀かの重芁なタスクに぀いおmongodbを「飌いならした」方法および倱敗した方法に぀いお詳しく説明したす。



mongoosejsnodejsのmongodb ORM

圌に぀いおは別に蚀いたい。 20人のナヌザヌのリストの遞択mongoでのデヌタの芁求ず遞択には2ミリ秒かかり、デヌタ転送には10ミリ秒かかりたす。その埌、mongooseは他の200ミリ秒既にメモリに぀いおは沈黙しおいたすを実行し、結果ずしおオブゞェクトを取埗したす。 これを䞋䜍レベルのnode-mongodb-nativeに曞き換えるず、これにはすべお30ミリ秒かかりたす。

埐々に、システム党䜓の速床を10倍に高めながら、mongodb-nativeのほがすべおを曞き換えなければなりたせんでした。



静力孊



すべおのTactoom統蚈はRackspace Cloud Storageに保存されたす。 その際、静的なcdnドメむンX .infosocial.netを䜿甚したす Xは1..n。 このドメむンはDNSを介しおCloud Storageのコンテナの内郚ドメむンに転送され、ブラりザが静的ファむルを䞊行しおロヌドできるようにしたす。 各静的ファむルは2぀のコピヌプレヌンおよびgzipに栌玍され、バヌゞョンが接続される䞀意の名前を持ちたす。 ファむルのバヌゞョンが曎新されるず、アドレスが倉曎され、ブラりザが新しいファむルをダりンロヌドしたす。



アプリケヌションの統蚈は、git-logを介しお倉曎されたファむルを定矩し、瞮小し、gzipコピヌを䜜成し、CDNにロヌドする自己蚘述メカニズムを通じお収集されたすクラむアントjsおよびcss、写真。 ビルドスクリプトは、倉曎されたむメヌゞも監芖し、察応するcssファむル内のアドレスを曎新したす。

すべおのファむルのアドレス統蚈のリストマッピングがRedisに保存されたす。 このリストは、起動時たたは静的バヌゞョンの曎新時にすべおのWebプロセスをメモリにロヌドしたす。

実際、静的に察する倉曎の展開解陀は、すべおを単独で行う1぀のチヌムによっお行われたす。 さらに、nodejsアプリケヌションはredis pub / subを介しおその堎で静的ファむルの倉曎されたアドレスを取埗するため、再起動は必芁ありたせん。



ナヌザヌ統蚈もRackspaceに保存されたすが、アプリケヌション静的ずは異なり、バヌゞョンはありたせんが、特定の正芏化を行うだけで、むメヌゞのハッシュを䜿甚しおCDN䞊のすべおのサむズのアドレスを受信できたす。



特定の静的ファむルが栌玍されるホスト定矩cdn X の堎合、䞀貫したハッシュが䜿甚されたす。



サヌバヌアヌキテクチャ







実際、Tactoomは3぀のハヌメチックゟヌンに分散しおいたす。

1. Rackspace-静的デヌタの高速スケヌリングずストレヌゞのためのプラットフォヌム

2.ペヌロッパのサむト -ここに物理サヌバヌ

3.シヌクレット ログはここでロヌテヌションされ、バックグラりンド蚈算が行われ、統蚈が収集されたす



1぀のサヌバヌだけが䞖界を探しおいたす-nginx、ポヌト80および4000が開いおいたす。埌者はCOMET接続に䜿甚されたす。

残りのサヌバヌは、ダむレクトIPを介しお盞互に通信し、iptablesを介しお䞖界䞭から閉じられたす。



80

nginxは、芁求をアップストリヌム構成を介しおWebサヌバヌにプロキシしたす。 珟時点では、2぀のアップストリヌム tac_mainずtac_mediaがありたす。 それぞれには、3000ポヌトでノヌドクラスタヌを実行しおいるWebサヌバヌのリストが含たれおいたす。各Webサヌバヌには、リク゚ストの配信においお独自の優先順䜍がありたす。

tac_mainは、デヌタベヌスに近いWebサヌバヌのクラスタヌであり、ほずんどのWebペヌゞを登録枈みのTactoomナヌザヌに配信したす。

tac_media -CDNの近くにあるWebサヌバヌのクラスタヌ。 それらを介しお、画像のダりンロヌドずサむズ倉曎のすべおの操䜜が行われたす。



webNおよびcloudNサヌバヌは 、Habra゚フェクトおよびその他の楜しいむベントでサヌバヌを远加する堎所を瀺しおいたす。

新しいサヌバヌは、CDNに保存されおいるむメヌゞで10分以内に立ち䞊がりたす。



4000

これは、nodejs COMET Besedaアプリケヌションが実行されおいる圗星サヌバヌぞの通垞のプロキシパスです。これに぀いおは、第2郚で説明したす。



tac1、tac2、data1

䞻なTactoomサヌバヌは次のずおりです。XEONX3440 4x2.53 GHz 16 GB 2x1500 GB Raid1。

それぞれがMongodプロセスを実行し、それらのすべおがReplicaSetで結合され、自動フェむルオヌバヌずスレヌブぞの読み取り操䜜の分散が行われたす。



メむンWebクラスタヌであるtac1で、クラりドクラスタヌであるtac2で。 各クラスタヌには8぀のnodejsプロセスがありたす。



近い将来、怜玢ク゚リのみがルヌティングされる別のアップストリヌムtac_searchを䜜成したす。 これにはWebクラスタヌがあり、これをelasticsearch 第2郚で説明サヌバヌの隣に配眮したす。



結論



NodeJSの䜜成者のスロヌガンを匕甚

「ブロックするものがないため、熟緎しおいないプログラマでも高速システムを開発できたす。」

「䜕もブロックされおいないため、専門家以䞋の人でも高速システムを開発できたす。」



  1. これはデマです。 私はもう2幎近くnodejsを䜿甚しおいたすが、私自身の経隓から、「高速システム」を開発するには、他のどのテクノロゞヌよりも少ないたたはそれ以䞊の経隓が必芁です。 実際には、nodejsのコヌルバック駆動型のパラダむムずjavascriptの䞀般的な機胜を䜿甚するず、パフォヌマンスを向䞊させるよりも、ミスを犯す可胜性が高くなりたすそしお、非垞に長い間探したす。
  2. 䞀方、「フィボナッチ数」の䟋は指から吞い出されるため、テッド・ゞりバ氏のトロヌリングもたったくナンセンスです。 Eventloopがどのように機胜し、なぜそれが必芁なのかを理解しおいない人だけがこれを行いたすこれは、ポむント1によっお蚌明されたす。




今春、 DevConfで講矩した埌、 NodeJSで新しいプロゞェクトを䜜成するかどうかに぀いおよく質問されたす。 みんなぞの私の答え

倚くの時間があり、新しい、生の、物議を醞す技術の開発に投資する準備ができおいるなら、先に進んでください。 しかし、タむムラむン/顧客/投資家がいお、背埌のサヌバヌサむドJSの経隓があたりない堎合は、 䟡倀がありたせん 。



実践が瀺しおいるように、NodeJSでプロゞェクトを䜜成するのは珟実的です。 動䜜したす。 しかし、それはかなりの費甚がかかりたした。 ノヌドのオヌプン゜ヌスコミュニティの䟡倀は䜕ですか



パヌト2



蚘事の2番目の郚分は先日です。 以䞋は、私がそれに぀いお曞くこずの短いリストです。

1.怜玢elasticsearch

2.メヌルGoogle App Engine

3.展開capistrano、npm

4.キュヌredis、kue

5. COMETサヌバヌbeseda



1぀の蚘事の情報が倚すぎたす。

コメントに興味深い質問がある堎合は、第2郚で回答したす。



PS



  1. 食べ物はありたせん。 私は自分の業瞟に蚀及せずに批刀を含むコメントを無芖したす。
  2. フロント゚ンドの忍者を探しおいたす 。詳现はこちら
  3. Tactoomはベヌタテスト䞭です。 登録は制限されおいたす。 メヌルを残すず、すぐに招埅状が届く堎合がありたす。




UPD 19.10

2番目の郚分は、倚くの䜜業のために遅れおいたす。



All Articles