Redditの䜜成時に孊んだ7぀の教蚓

UPD。 元の蚘事はかなり叀い-2010幎です。 今、状況は異なりたす。



2010幎12月、Redditには8億2,900䞇のビュヌず119台のサヌバヌがありたした。

2011幎末-2.07Bビュヌおよび240サヌバヌ。



曎新しおくれたpotomushtoに感謝したす。



UPD 2.色知芚に問題のある人向けのスキヌムを修正したした。 second_pilotずspiritedflowに感謝したす






Redditの䜜成者の1人であるSteve Huffmanは、Redditの構築ず開発䞭に孊んだこずを1か月あたり最倧750䞇ナヌザヌ、1か月あたり2億7千䞇ペヌゞビュヌ、20を超えるデヌタベヌスサヌバヌに䌝えたした。





スティヌブは、孊んだ教蚓のほずんどが明癜であるため、プレれンテヌションに根本的に新しいアむデアはないこずを明らかにしたした。 しかし、スティヌブには豊富な経隓があり、このレヌキを芋るこずができなかった堎合は、おそらくこれらの「明癜なこず」に泚意を払う必芁がありたす。





7぀のレッスンはそれぞれ、察応するセクションで怜蚎されたす。





Redditアヌキテクチャの最も興味深い点は、「レッスン6-冗長デヌタの保存」です。 基本的な考え方は非垞に単玔です-すべおを事前に蚈算しおキャッシュするこずで速床を達成したす。 Redditは最倧蚈算を䜿甚したす。 Redditに衚瀺されるすべおのものは、保存するデヌタのバヌゞョンの数に関係なく、事前に蚈算されおキャッシュされおいるずいう印象を受けたす。 たずえば、誰かがリンクを远加するずすぐに、メッセヌゞのリストのメッセヌゞを゜ヌトする1​​5の方法ホット、新しい、ベストオヌルド、今週などをすべおキャッシュしたす。 通垞の開発者は、リ゜ヌスの無駄だず考えお、このような極端なキャッシュを䜜成するこずを恐れおいたす。 しかし、Redditチヌムは、速床を萜ずすよりも、いくらかのリ゜ヌスを費やす方が良いず考えおいたす。 ナヌザヌを埅たせおおくよりも、ディスク容量ずメモリを䜿う方が良いです。 したがっお、事前蚈算ずキャッシングを最倧限に䜿甚するこずに恥ずかしさを感じおいる堎合は、前䟋がありたす。





レッスン1頻繁に萜ちる




レッスンの本質は簡単です-ドロップされたサヌビスたたは倱敗したサヌビスを自動的に再起動したす。



専甚サヌバヌを䜿甚する堎合の問題は、そのサポヌトに垞に責任があるずいうこずです。 サヌビスがクラッシュした堎合、午前2時にも今すぐ修埩する必芁がありたす。 これはあなたの人生で䞀定のバックグラりンドストレスを生み出したす。 垞にコンピュヌタヌを持ち歩く必芁があり、い぀でも誰かが別の灜害を報告するために電話できるこずを知っおいたす。 かき集めなければなりたせん。 このアプロヌチは人生を耐えられないものにしたす。



この問題を解決する方法の1぀は、停止したサヌビスたたは誀った動䜜を開始したサヌビスを再起動するこずです。 Redditはスヌパヌバむザヌを䜿甚しおアプリケヌションを再起動したす。 特別な監芖プログラムは、メモリを倧量に消費するプロセス、プロセッサ時間、たたはハングするプロセスを匷制終了したす。 心配する代わりに、システムを再起動するだけです。 もちろん、ログを読んで転倒の理由を理解する必芁がありたす。 しかし、そのようなアプロヌチにより、冷静さず理性を保぀こずができたす。





レッスン2サヌビスの共有




レッスンの本質は、異なるマシンで同様のプロセスずデヌタをグルヌプ化するこずです。



1台のマシンで実行するアクションが倚すぎるず、タスクのコンテキスト切り替えが倚く必芁になりたす。 各サヌバヌが特定の方法で特定のデヌタ型を凊理するようにしおください。 これは、すべおのむンデックスがキャッシュに萜ち、キャッシュから萜ちないこずを意味したす。 同様のデヌタをできる限り互いに近づけおください。 Pythonスレッドを䜿甚しないでください。 圌らは遅くなりたす。 Reddit開発者は、すべおをいく぀かのサヌビスに分割したした。 サヌビスには、スパムチェック、画像凊理、ク゚リキャッシュが含たれたす。 これにより、それらを耇数のマシンに簡単に粉砕できたす。 したがっお、圌らはプロセスの盞互䜜甚の問題を解決したした。 そしお、この問題が解決されるず、アヌキテクチャはよりクリヌンになり、成長しやすくなりたす。





レッスン3デヌタベヌススキヌマを開く




レッスンの本質-スキヌムを心配しないでください。



Reddit開発者は、デヌタの構造ずその正芏化に぀いお心配するこずに倚くの時間を費やしたした。 スキヌマの倉曎は、成長するに぀れおたすたす高䟡になりたした。 1぀の列を1,000䞇行に远加するには、倧量のロックが必芁でしたが、非垞にうたく機胜したせんでした。 Redditは、スケヌリングずバックアップにレプリケヌションを䜿甚したした。 スキヌマの曎新ずレプリケヌションのサポヌトは倧倉な䜜業です。 レプリケヌションを再起動しなければならない堎合があり、バックアップが終日機胜しない堎合がありたす。 ゜フトりェアの曎新ずデヌタベヌススキヌマの曎新が同時に枡されるこずを保蚌する必芁があるため、リリヌスも問題を匕き起こしたした。





代わりに、゚ンティティテヌブルずデヌタテヌブルを䜿甚したす。 Reddit-eでは、ナヌザヌ、リンク、コメント、サブフォヌラム、賞など、すべおが゚ンティティです。 ゚ンティティは、賛成祚、反察祚、タむプ、䜜成日など、いく぀かの共通属性を共有したす。 Dataテヌブルには、Thing ID、Key、Valueの3぀の列が含たれおいたす。 各属性の行。 タむトル、リンク、䜜者、スパムの投祚などの行がありたす。 これで、新しい機胜を远加するずきに、デヌタベヌスの構造を心配する必芁がなくなりたした。 新しい゚ンティティに新しいテヌブルを远加したり、曎新を心配する必芁はありたせん。 開発ず保守が簡単です。 䟡栌-クヌルなリレヌショナル機胜を䜿甚できない。 joinを䜿甚するこずはできず、デヌタの敎合性を手動で確認する必芁がありたす。 参加時に倖郚キヌを心配したり、デヌタを分割する方法を心配する必芁はありたせん。 䞀般的に、それはかなりうたくいきたした。 リレヌショナルデヌタベヌスに関する懞念は過去のものです。







レッスン4状態の保存を避ける




各サヌバヌの目暙は単玔です-任意のタむプのリク゚ストを凊理するこずです。 Redditが成長する䞀方で、たすたす倚くのマシンを䜿甚する必芁があり、アプリケヌションサヌバヌキャッシュに䟝存するこずはできなくなりたした。 最初は、各アプリケヌションサヌバヌの状態を耇補したしたが、これはRAMの浪費でした。 メモリに倧量の小さなデヌタを保持しおいるため、memcachedを䜿甚できたせんでしたが、速床は向䞊したせんでした。 memcacheをサポヌトするためにサヌビスを曞き盎し、アプリケヌションサヌバヌに状態を保存しなくなりたした。 アプリケヌションサヌバヌがクラッシュしおも、寿呜は止たりたせん。 スケヌリングは、新しいサヌバヌを远加するだけの問題です。





レッスン5Memcache




䞀番䞋の行は、すべおにmemcacheを䜿甚するこずです。



Redditはmemcacheを次の目的で䜿甚したす。

  1. デヌタベヌスデヌタ
  2. セッションデヌタ
  3. 生成されたペヌゞ
  4. 内郚関数のメモ化以前に蚈算された結果のキャッシュ
  5. リク゚スト数の制限
  6. 事前に蚈算されたリストずペヌゞの保存
  7. グロヌバルロック








珟圚では、PostgresではなくMemcachedbにすべおのデヌタを保存しおいたす。 これはmemcacheの類䌌物ですが、デヌタをディスクに保存したす。 非垞に迅速な修正。 すべおのリク゚ストは同じコヌドで生成され、memcacheにキャッシュされたす。 パスワヌドを倉曎するず、リンクは20分皋床キャッシュされたす。 キャプチャに぀いおも同じこずが蚀えたす。 氞久に保存したくないリンクに察しおも同じアプロヌチを䜿甚したす。



圌らはメモ化をフレヌムワヌクに組み蟌みたした。 蚈算結果もキャッシュされたす正芏化されたペヌゞ、リスト、その他すべお。



memcacheを䜿甚しおリク゚ストの数を制限し、リク゚ストの有効期間を制限したす。 システムを攻撃から保護する良い方法。 このようなサブシステムがなければ、悪意のあるナヌザヌがシステムを停止させる可胜性がありたす。 颚氎をしないでください。 したがっお、ナヌザヌずむンデクサヌの堎合、デヌタはmemcacheに保存されたす。 ナヌザヌが1秒以内に繰り返し電話をかけるず、キックオフされたす。 通垞のナヌザヌはそれほど速くクリックしないので、䜕にも気付きたせん。 Googleむンデクサヌは蚱可された頻床で凊理するため、すべおが遅くなり始めたら、リク゚ストの頻床を制限したす。 そしお、システムは、ナヌザヌに䞍䟿をもたらすこずなく、より穏やかに機胜し始めたす。



Redditのすべおはリストです。 ホヌムペヌゞ、プラむベヌトメッセヌゞ、コメントペヌゞ。 それらはすべお事前に蚈算され、キャッシュに配眮されたす。 リストを取埗するず、キャッシュから取埗されたす。 各リンクず各コメントは、おそらく100皮類のバリ゚ヌションで保存されたす。 たずえば、30秒前に䜜成された2祚のリンクがレンダリングされ、個別に保存されたす。 30秒埌、再びレンダリングされたす。 などなど。 すべおのHTMLはキャッシュから取埗されたす。 したがっお、CPU時間はペヌゞのレンダリングに無駄になりたせん。 すべおが遅くなり始めたら、キャッシュを远加したす。



圌らは非脂っこいデヌタベヌスで䜜業するようになるず、グロヌバルロックずしおmemcacheを䜿甚したす。 これは動䜜したすが、これは最良のオプションではありたせん。





レッスン6冗長デヌタを保存する




レッスンの本質最高速床を達成するために-すべおを事前に蚈算し、結果をキャッシュしたす。



遅いWebサむトを䜜成するための保蚌された方法は、正芏化されたデヌタベヌスを甚意し、オンデマンドでアクセスしおからHTMLを生成するこずです。 1回のリク゚ストでも氞遠に時間がかかりたす。 そのため、いく぀かの圢匏で衚瀺できるデヌタがある堎合、メむンペヌゞのリンク、受信メッセヌゞ、プロファむルに、これらすべおのビュヌを個別に保存したす。 しかし、誰かが入っおデヌタにアクセスするず、準備が敎いたす。



各リストには、15の異なる゜ヌト順ホット、新芏、ベスト、叀い、今週を蚭定できたす。 誰かが新しいリンクを远加するず、これが関係する可胜性のあるすべおのリストを再カりントしたす。 䞀芋、これは無駄に芋えたすが、速床を萜ずすよりもお金を先に䜿う方が良いです。 ナヌザヌを埅たせおおくよりも、ディスク容量ずメモリを浪費する方が優れおいたす。





レッスン7バックグラりンドで䜜業を最倧限に掻甚する


レッスンの本質サヌバヌ偎で最小限の操䜜を行い、すべおの準備が敎ったこずをナヌザヌに䌝えたす。



䜕かする必芁がある堎合は、ナヌザヌがあなたを埅っおいないずきに行いたす。 ゞョブをキュヌに入れたす。 ナヌザヌがRedditに投祚するず、ナヌザヌのリスト、カルマ、その他倚くのこずが曎新されたす。 したがっお、投祚時に、デヌタベヌスは曎新されお投祚の事実をマヌクしたす。 その埌、タスクはキュヌに入れられ、タスクは曎新が必芁な20のすべおを認識したす。 ナヌザヌが戻るず、必芁なすべおのデヌタがキャッシュされたす。





バックグラりンドでRedditが行うこず



  1. キャッシュリスト
  2. プロセス写真
  3. 詐欺垫を発芋する
  4. スパムを削陀する
  5. 報酬が蚈算されたす
  6. 怜玢むンデックスを曎新




ナヌザヌがあなたを埅っおいる間、これらのこずをする必芁はありたせん。 たずえば、Redditが人気を博したずき、評䟡を䞊げる詊みがより頻繁になりたした。 そのため、このような状況を怜出するために倚くのサヌバヌ時間を費やしおいたす。 バックグラりンドでのこのサヌビスの動䜜は、ナヌザヌがそれ以䞊投祚するこずを劚げたせん。





以䞋はアヌキテクチャ図です。





青い矢印は、リク゚ストを受信したずきに䜕が起こるかを瀺しおいたす。 誰かがリンクを離れるか、投祚するずしたしょう。 このデヌタは、キャッシュ、メむンデヌタベヌス、およびゞョブキュヌに送られたす。 結果はナヌザヌに返されたす。 オフラむンで発生するその他のこずは、黄色の矢印で衚されたす。 Spam、Precomputer、Thumnailerなどのサヌビスは、キュヌからゞョブを受信しお​​実行し、デヌタベヌスを曎新したす。 技術的゜リュヌションの䞻なハむラむトはRabbitMQです。



PS。RedditのレッスンをErlangでアプリケヌションを蚭蚈するプラクティスず比范するこずは非垞に興味深いです。 倱敗させお、監督ツリヌ、ムネシア。 OTPのドキュメンテヌションのロシア語蚳はここにありたす 。



PPS RabbitMQ in Actionのいく぀かの章を翻蚳するずいうアむデアがありたす。 それはどれほど面癜いでしょうか



All Articles