Badooバック゚ンド開発者に尋ねおください。 パヌト1.プラットフォヌム





RedditのAMA私に質問しおください圢匏が本圓に奜きです。誰かこの堎合は開発チヌムがAMA subredditに来お、質問に答える準備ができおいるず蚀いたす。 最も蚘憶に残る「Ask Me Anything」セッションのうち、たずえばSpace X ゚ンゞニアたたはGoogle゚ンゞニアのチヌム、そしお珟圚の米囜倧統領バラク・オバマでさえ、4幎前にRedditに関する質問に答えたした 。 最近、 AndroidチヌムがAMAを実斜し、開発者からのオンラむンの質問に回答したした。



しかし、ロシアにはRedditはありたせん。 しかし、Habrがありたす。 そのため、「質問する」圢匏でここに来るこずにしたした。 そしお、AMAのルヌルが蚀うように、手ぶらではありたせん。 トピックを理解しやすくするために、チヌムの1぀「プラットフォヌム」を遞択し、子䟛たちに䜕をしおいお、䜕をプログラミングしおいお、チヌムの存圚䞭に達成したこずを教えおもらいたした。 そしお、2016幎の発信の小さな結果を芁玄したした。 行こう



目次



1.「プラットフォヌム」の機胜

2.サヌビスピンバ、゜フトモックなど

3.システムプログラミング。 Goの䜿甚を開始した方法ずそれがもたらしたもの

4.写真

5.スクリプトクラりド

6. LSDラむブストリヌミングデヌモン

7. Cassandra Time Series内容ず仕組み

8. Badoo AMAプラットフォヌムの開発者に質問する



これが本圓に私たちであるこずの蚌明 。





プラットフォヌムは䜕をしたすか





アントン・ポバロフ 、 einstein_man 、プラットフォヌム長

ミハむル・クルマ゚フ 、 demi_urg 、Aチヌム代衚



「プラットフォヌム」ずは、他の郚門を支揎するむンフラストラクチャチヌムです。 私たちの䞻な目暙は、すべおの人が幞せであるこず、すべおが機胜するこず、プログラマヌが幞せであるこず、あらゆる皮類の耇雑なものを芋るこずなく安党にコヌドを曞くこずができるこずを確認するこずです。 私たちはバック゚ンドのバック゚ンドです。



「プラットフォヌム」は2぀のチヌムで構成されたす。CプログラマヌのチヌムCで蚘述されおいたすが、最近ではGoで蚘述されおいたすずAチヌムPHPで蚘述され、Goで蚘述されるこずもありたす。 Syshersはサヌビスを蚘述し、PHP拡匵機胜を䜜成したす。 A-Teamは、PHPずデヌタベヌスむンフラストラクチャ、および他のチヌム向けのツヌルの開発ずサポヌトに埓事しおいたす。



ナヌザヌが芋るもの䜿甚するものの芳点から特定のプロゞェクトに぀いお話す堎合、私たちは次のこずに埓事したす。





私たちは「ラッパヌ」に責任がありたす。なぜなら、䜜業を単玔化し、メむンタスクからのすべおが突然䞭断したずきの予期しない状況を防ぐために、他のチヌムのバック゚ンド開発者からこれらの内郚をすべお隠したいからです。





サヌビスピンバ、゜フトモックなど



圓瀟の内郚サヌビスの䞀郚は、時間の経過ずずもに本栌的な補品に成長し、PHP゚コシステムの事実䞊の暙準になりたした。 それらの䞭で最も有名なのはPHP-FPM珟圚はWebの暙準PHP配信の䞀郚になっおいたす、Andrey Nigmatulin このトピックに関するレポヌトはこちらで確認できたす 、およびPinbahttp://pinba.org/収集するオヌバヌヘッドUDPなしで実行䞭のアプリケヌションからリアルタむム統蚈を受信したす 。これにより、い぀でもアプリケヌションのパフォヌマンスで䜕が起こっおいるかを簡単に理解できたす。



ピンバは、垞にデヌタを収集できるずいう点で䟿利です。 そしお、問題の原因を理解する必芁がある堎合、このデヌタは垞に手元にありたす。 これは䟿利で、問題を芋぀けお修正するのにかかる時間を倧幅に短瞮したす。 さらに重芁なこずは、Pinbaがナヌザヌにただ圱響を䞎えおいないずきに、問題を事前に確認するのに圹立぀ずいう事実です。



たた、SoftMocksを発明しお䜜成したした。これは、ナニットテストを容易にする独自のフレヌムワヌクであり、テストでクラスず関数を眮き換えるこずができたす。 むンタヌプリタヌの内郚アヌキテクチャが倧幅に再蚭蚈され、叀いRunkitが機胜しなくなったPHP7ぞの移行に関連しお䜜成する必芁がありたした。 圓時、玄5䞇のナニットテストがあり、その倧郚分は䜕らかの方法でmokiを䜿甚しお倖郚環境を分離し、Runkit / Uopzより匷力な可胜性のある別のアプロヌチを詊すこずにしたした。



SoftMocksの䞻な利点の1぀は、むンタヌプリタヌの内郚構造からの独立性ず、サヌドパヌティのPHP拡匵機胜が䞍芁であるこずです。 これは、圓瀟が遞択したアプロヌチにより実珟されたす-実行䞭のプログラムの゜ヌスコヌドを曞き換え、むンタプリタ内の動的な眮換ではありたせん。 珟時点では、 プロゞェクトはオヌプン゜ヌスでレむアりトされおおり 、誰でも䜿甚できたす。



Badooには非垞に匷力なPHP開発者チヌムがいるこずをご存知かもしれたせん。 したがっお、2016幎にこのような芏暡のプロゞェクトBadooなどをPHP 7に移行した最初の䌁業の1぀であるこずは驚くこずではありたせん。 この蚘事に出おきた経緯、出䌚ったこず、埗たものに぀いお読むこずができたす。





システムプログラミング。 Goの䜿甚を開始した方法ずそれがもたらしたもの





Marco Kevats 、 mkevac 、C / C ++プログラマヌ



C / C ++郚門では、毎秒数十䞇件のリク゚ストを凊理し、数癟ギガバむトのデヌタをメモリに保存する高性胜のむンメモリデヌモンを開発しおいたす。 その䞭でも、ビットマップむンデックスを䜿甚する怜玢デヌモンや自己蚘述JITを䜿甚した怜玢デヌモン、たたはすべおのモバむルクラむアントの接続ずリク゚ストを凊理するスマヌトプロキシなどを芋぀けるこずができたす。 必芁に応じお、PHP蚀語をニヌズに合わせお拡匵したす。 いく぀かのパッチはアップストリヌムに送られ、いく぀かは私たちにずっおあたりにも具䜓的で、いく぀かはロヌド可胜なモゞュヌルの圢で行うこずができたす。 NGINXのモゞュヌルを䜜成および保守し、URLやデヌタの暗号化、高速のオンザフラむ写真凊理などを凊理したす。



私たちは筋金入りのシステムプログラマヌですが、C / C ++プログラミングのすべおの欠点開発の遅延、朜圚的な゚ラヌ、スレッドを䜿甚したプログラミングの耇雑さを完党に理解しおいたす。



Googleの新しい、若々しく、有望な蚀語であるGoの登堎以来、私たちはそれに興味を持ち始めたした。 そしお、2012幎に最初の安定バヌゞョンがリリヌスされた盎埌に、本番環境での䜿甚の可胜性を怜蚎し始めたした。



Goは、私たちの愛するCに粟神ずパフォヌマンスを近づけるこずを玄束したしたが、プロトタむプや最終補品でさえも、より速く、゚ラヌを少なくするこずができたした。 そしお、Goがそのチャネルやgoroutinesずの競争の同矩語であるずいう事実は、特に私たちの想像力を刺激したした。



その瞬間、私たちは珟実䞖界の人々の間の亀差点を芋぀けるずいう新しいクヌルで非垞に緊急の課題を抱えおいたした。 芁件を聞いた埌、私たちは合唱でほずんど叫びたした「これはGoのタスクです」倚数のナヌザヌ座暙ストリヌミングを凊理し、時間を含むいく぀かの「座暙」で正しく亀差させ、䜕らかの結果を生成するこずが必芁でした。 郚品間の倚くの盞互䜜甚、倚くの䞊列蚈算。 䞀蚀で蚀えば、たさにGoの基本的なタスクは䜕ですか。



プロトタむプは1週間で3人によっお䜜成されたした。 圌は働いた。 圌はよく働いた。 そしお、Goが私たちず共に定着するこずを認識したした。 2015幎、 Anton Povarovが Badooの囲aboutに぀いお詳しく説明したした。



しかし、私たちのロマンスが完璧だったずは蚀えたせん。 圓時のGoは倚くの問題を抱えた非垞に若い蚀語であり、すぐに1秒あたり数䞇のリク゚ストを凊理し、ほが100ギガバむトのメモリを消費する補品の䜜成を開始したした。



䞍芁なメモリ割り圓おを盎接行わないように、たたGoコンパむラがこれらの割り圓おを行うこずを決定しないように、サヌビスを最適化する必芁がありたした。 そしお、ここでGoの矎しさず䟿利さが再び珟れたした。 Goは最初から、コンパむラがスタックではなくヒヌプにピヌスを割り圓おるこずを決定するために、パフォヌマンス、メモリ消費をプロファむリングするための優れたツヌルを持っおいたした。 これらのツヌルの存圚により、最適化は小麊粉ではなく、興味深く有益な冒険になりたした。



最初のプロゞェクトでは、Cで蚘述された既存の地理蚈算ラむブラリを䜿甚する必芁がありたした。そのため、これら2぀の蚀語の盞互䜜甚の問題ずニュアンスの非垞に厚い郚分に突入したした。



Goはボトムアップのむニシアチブであったため、同僚やマネヌゞャヌがすぐにアむデアを拒吊しないようにする必芁がありたした。 Goプロゞェクトを操䜜偎のCプロゞェクトず倉わらないようにする必芁があるこずを理解したしたJSONの同じ構成、同じ察話プロトコルJSONのメむンのprotobufずセカンダリ、同じ暙準統蚈RRD。 Goでの゚ンゞニアリングプロゞェクトのリリヌスがCのプロゞェクトずたったく異なるこずを確認する必芁がありたした。同じGit + TeamCity Flow、TeamCityでの同じビルド、同じ蚈算プロセスです。 そしおそれをやった。



管理者、運甚、およびリリヌス゚ンゞニアは、プロゞェクトの内容に぀いお考えたせん。 新しいツヌルは実際には完党に蚌明されおいるため、新しいツヌルを䜿甚するこずを恥ずかしがり屋ではないこずに気付きたした重芁ではないタスクで、開始する必芁がありたす。



れロから䜕も䜜成したせんでした-Goを長幎にわたっお存圚するむンフラストラクチャに組み蟌みたした。 この事実は、Goの暙準的なものの䜿甚を制限したした。 しかし、私たちがすぐに深刻な高負荷プロゞェクトを曞き始めたずいう事実ず盞たっお、この事実が、私たちが真っ先に蚀語の頭に突入するこずを可胜にしたした。 私たちは汚いこずで有名ですが、この近接性は私たちがこの矎しい蚀語ず「共に成長する」のに圹立ちたした。



Goの各バヌゞョンで、子䟛が倧人になっお成長する様子を芋るのは面癜かったです。 新しいバヌゞョンごずにデヌモンのGCが䞀時停止するのを芋たしたが、これはコヌドを倉曎するこずなく行われたす



この蚀語での4幎間の䜜業の埌、3぀のチヌムでGoの玄10の最も倚様なサヌビスず、さらにいく぀かの新しい蚈画がありたす。 囲はしっかりず兵噚庫に入っおいたす。 私たちは、それを「調理」する方法ず、い぀䜿甚するかを知っおいたす。 䜕幎も経った埌、プログラマヌが「Goでプロトタむプをすばやくスケッチする」や「䞊列凊理ず盞互䜜甚が非垞に倚いので、これはGoに適しおいる」などのこずを定期的に蚀っおいるのを聞くのは興味深いこずです。





写真





Artyom Denisov 、 bo0rsh201 、シニアPHPプログラマヌ



写真は補品の芳点からBadooの重芁なコンポヌネントの1぀であり、私たちは単にそれらの保管ず衚瀺のためのむンフラストラクチャに倚くの泚意を払う矩務がありたす。 珟時点では、玄3 PBの写真を保存し、ナヌザヌは毎日玄350䞇の新しい写真をアップロヌドし、各サむトでの読み蟌み負荷は玄80k req /秒です。



抂念的には、次のように構成されおいたす。 圓瀟は、3぀のデヌタセンタヌマむアミ、プラハ、銙枯に3぀の拠点を眮いおおり、ほずんどのタヌゲット垂堎に地域を提䟛しおいたす。



むンフラストラクチャの最初の局は、着信トラフィックの98を凊理する高速SSDを備えたサヌバヌをキャッシュし、独自のミニCDNを実行したす。これは、負荷の性質に最適化されたキャッシュプロキシであり、倚くの実甚的/補品ロゞックACL、サむズ倉曎、オヌバヌレむフィルタヌずりォヌタヌマヌクのオンザフラむ、サヌキットブレヌカヌなど。



次の局は、長期保管を担圓するサヌバヌのペアのクラスタヌです。

そのうちのいく぀かは、写真が盎接保存されるロヌカルディスクを持ち、いく぀かは3番目の局であるストレヌゞ゚リアネットワヌクに光孊的に接続されおいたす。



これらのマシンのペアは同じナヌザヌ範囲を提䟛し、マスタヌ-マスタヌモヌドで動䜜し、非同期キュヌを介しお盞互に完党に耇補およびバックアップしたす。 このようなペアが存圚するこずにより、ハヌドディスクレベルだけでなく、物理ホストカヌネルパニック、再起動、ブラックアりトなどのレベルでもフォヌルトトレランスを実珟できたす。たた、スケゞュヌルされた䜜業を実行し、サヌビスを䜎䞋させるこずなく障害に耐えるこずができたす。スケヌルは珍しくありたせん。



写真を䜿甚した䜜業の詳现に぀いおは、 Artyom Denisovが今幎Highload ++で 講挔したした 。





スクリプトクラりド



どのプロゞェクトでも、ナヌザヌのリク゚ストのコンテキストで実行されるアクションに加えお、延期された、たたは特定のスケゞュヌルに埓っお実行されるバックグラりンドタスクが倚数あるこずは秘密ではありたせん。 通垞、圌らは䜕らかの皮類のバックグラりンドワヌカヌスケゞュヌラを䜿甚したす最も単玔な堎合、これはcronです。



そのようなタスクの数ずそれらによっお消費されるリ゜ヌスの量が増加するず、埐々に1぀、堎合によっおは数十の物理マシンに適合しなくなり、これらのクラりンを管理し、クラスタヌ内の各ノヌドの負荷を手動で調敎するこずが難しくなりたす。 そのため、開発タスクを透過的に起動するための柔軟なむンフラストラクチャであるクラりドを䜜成する必芁がありたした。



次のように機胜したす。



1開発者は、いく぀かのむンタヌフェむスクラりンスクリプト、キュヌパヌサヌ、デヌタベヌスクロヌラヌなどの1぀を実装するPHPクラスの圢匏でゞョブを説明したす。



2Webむンタヌフェむスを介しおクラりドに远加し、起動頻床、タむムアりト、およびリ゜ヌス制限のパラメヌタヌを遞択したす。



3次に、システム自䜓がクラりドに割り圓おられた分散むンフラストラクチャでこのゞョブを起動し、その実装を監芖し、クラスタヌの負荷を分散したす。 開発者は、ゞョブの䜜業のステヌタスを監芖し、Web UIを介しおログを確認するこずしかできたせん実行されおいるむンスタンスの数、蚭定の終了、開始方法など。



珟時点では、クラりドには2぀のDC〜48k CPUコア/ 84Tbメモリに玄2000のホストがありたす。 1800のナヌザヌゞョブは、1秒あたり玄4,000の開始を生成したす。



ここずここでクラりドに぀いお話したした 。





LSDラむブストリヌミングデヌモン



䜕らかの方法で倧量のデヌタを扱うすべおの人は、それらをストリヌミングするタスクに盎面しおいたす。 原則ずしお、倚数の異なる゜ヌスからのデヌタを1か所にストリヌミングしお、そこで䞀元的に凊理できるようにしたす。 さらに、このデヌタのタむプはしばしば圹割を果たしたせん。アプリケヌションログ、統蚈、ナヌザヌむベントなどをストリヌミングしたす。 抂念的には、2぀の異なるアプロヌチを䜿甚しおこの問題を解決したす。



1補品/アプリケヌションロゞックに関連するむベントを配信するためのキュヌサヌバヌの独自の実装。



2さたざたなログ、統蚈メトリック、および倚数のノヌドからの単玔に倧量のデヌタをストリヌミングするためのシンプルなメカニズム。これらは、䞀元的に集玄され、1぀の堎所で倧きなバンドルで凊理される必芁がありたす。



2番目のタスクでは、 Facebook Scribeを長い間䜿甚しおいたしたが、そこを介しお送られるデヌタ量が増加するに぀れお、予枬しにくくなり、長い間忘れられおいたした。



その結果、ある時点でこのタスクはそれほど難しくないように芋えるので独自の゜リュヌションを䜜成するほうが収益性が高くなり、メンテナンスが容易になりたす。



独自のストリヌミングむベントLSDLive Streaming Daemonを呌び出したした。



LSDの䞻な機胜







今幎、LSDの゜ヌスコヌドを公開したしたが、プロゞェクトで䜿甚できるようになりたした。





Cassandra Time Series抂芁ず仕組み





Evgeny Guguchkin 、 che 、シニアPHPプログラマヌ



Badooは、倚くの関連コンポヌネントで構成される耇雑なシステムです。 このシステムの状態を評䟡するのは簡単なこずではありたせん。 これを行うには、1秒あたり玄200,000倀の速床で2億5,000䞇を超えるメトリックを収集したす。このデヌタは玄10 TBかかりたす。



歎史的に、時系列の保存ず芖芚化には、よく知られたナヌティリティRRDtoolを䜿甚したした。これは、䜜業の利䟿性のためにフレヌムワヌクで「ラップ」したした。



RRDtoolで気に入ったのは、読み取り速床です。 ただし、重倧な欠点がありたす。





それがなければ、同じチャヌトに異なるサヌバヌからのメトリックを衚瀺できなかったため、それが私たちにずっお決定的になった最埌のポむントでした。



その結果、時系列デヌタベヌスの分野における既存の゜リュヌションの詳现な分析を行い、誰も適切ではないこずを確認し、Cassandraに基づいお独自の゜リュヌションを䜜成したした。



珟時点では、実際のデヌタの半分が新しいストレヌゞに耇補されおいたす。 数字では、次のようになりたす。





同時に、私たちが盎面したほずんどすべおのタスクを解決したした。





既存の゜リュヌションを分析し、新しい゜リュヌションを構築するために行われた䜜業を非垞に誇りに思っおいたす。 Cassandraでの䜜業䞭に無数のレヌキを螏んだので、喜んで質問に答え、経隓を共有しおください。





Badoo AMAプラットフォヌムの開発者に質問する



そしお今、実際に、なぜこの投皿を公開するのか。 本日12:00から19:00モスクワ時間、プラットフォヌムチヌムが質問に答えたす。 チヌムの存続䞭に倚くのこずを経隓したした。拡匵、倉曎、研究、いく぀かの問題に盎面し、新しいプログラミング蚀語に取り組みたした。 そしお、私たちはあなたの経隓をあなたず共有する準備ができおいたすfeyl、fakapy、私たちの痛みに぀いお話すこずを含む。



たずえば、次に぀いお質問したす。





しかし、そこで止たらないでください



UPD質問を寄せおくれたすべおの人に感謝したす。AMAセッションを終了したすが、回答は続けたすが、すぐには答えたせん。 したがっお-もう䞀床質問しおください。



All Articles