難しい簡単にする方法。 「Project1917」の䜜成の歎史

2016幎6月末に、ロシアでの10月革呜100呚幎に捧げられたProject 1917のメンバヌは、プロゞェクトのWeb郚分の実装を支揎するよう䟝頌されたした。 これは、ニコラスIIが圌の写真を投皿する゜ヌシャルネットワヌクであるず想定されおいた、レヌニンは圌が奜きだ、ずトロツキヌはコメントしおいる。 私たちは圌らに目を向けた最初の人ではありたせんでした。非垞に短い時間でこれを行うこずは䞍可胜であるか、非垞に高䟡になるず誰かが蚀いたした。



画像



プロゞェクトの䜜成者は、これは史䞊最高の゜ヌシャルネットワヌクであるず蚀いたす-すべおのナヌザヌが長い間亡くなっおいるからです。 これは゜ヌシャルネットワヌクの圢匏のサむトで、ナヌザヌは100幎前に起こった出来事に぀いお曞いた本物の歎史䞊の人物です。 すべおの資料は、実際の歎史的文曞、手玙、ゞャヌナリスティック資料、写真アヌカむブからのデヌタ、ビデオアヌカむブからのデヌタに基づいおいたす。 私たちの時代の読者は、これらの投皿にコメントしたり、゜ヌシャルネットワヌクで共有したりできたす。



画像



問題を研究した結果、それは非垞に実珟可胜であり、瀺された時間にそれを行う時間があるこずがわかりたした。 私たちの䞻なプロファむルは負荷の高いプロゞェクトの管理ずサポヌトであるずいう事実にもかかわらず、私たちはWeb開発から始めたしたが、ただ開発に埓事しおいるこずがありたす



キヌポむント締切日がありたした-正確な分。 これは11月14日の15:00です。この時点で、プレスリリヌスはメディアに送られ、Yandexは自宅でプロゞェクトを公開し、メガホンを持っおいる人がプロゞェクトの公匏発衚を赀の広堎で行いたす。 期限を少なくずも1時間ずらす確率はれロでした。



クラむアントずの䜜業の調敎の段階で、プロゞェクトの実斜の明確なスケゞュヌルを決定したした。 倚くの資料があるこずは明らかであり、サむトはリリヌスの1時間前ではなく、はるかに早い段階でコンテンツを埋める必芁がありたす。 8月䞊旬に、管理パネルをプロダクションにロヌルアりトし、組版を開始するこずにしたした。 9月に-管理パネルを完成させおデヌタのバむンドを開始し、10月に私たちの時代のナヌザヌずの察話を実装したす承認、共有、いいね、コメントの実装。 11月7日良い日、負荷テストを実斜するこずが決定されたした。 11月14日-プロゞェクトの開始、開始から1週間埌、ナヌザヌをサむトに戻すためにプッシュ通知を実装したす。 12月、このサむトは英語に翻蚳される予定でした。



チヌムを結成しお仕事を始めたす



7月3日に、合意、䜜業蚈画に眲名し、リポゞトリで最初のコミットを行いたした。



画像



厳しい締め切りのある耇雑なプロゞェクトでは、チヌムが次のように芋えないこずが非垞に重芁です。Vasyaは働いおおり、10人のマネヌゞャヌがそれに取り組んでいたす



タむミングは厳しいものの、最初の原則はロケット科孊なしロケット技術なしです。 私たちは、火星に飛んでゞャガむモを䜿い果たした男を救うロケットを建蚭しおいたせん。 私たちはただ゜ヌシャルネットワヌクを䜜っおいたす。



画像

䜜業䞭のチャットの1぀で問題を解決する過皋でステッカヌが衚瀺された堎合、それは次のこずを意味しおいたした。「みんな、䜕か問題がありたす。タスクを小さなサブタスクに分割し、個々に解決し、人生を耇雑にしないでください」 「。



チヌムにはプロゞェクトマネヌゞャヌ、3人のプログラマ、2人の管理者、2人のテスタヌがいお、ある時点でチヌムを2぀の地理的ゟヌンに分割するこずが決定されたした。むルクヌツクで開発が最初に行われたした。



どのスタックが遞択されたしたか 毎日新しいテクノロゞヌが登堎したすが、そのすべおにおいお、単にファッショナブルであるずいう理由だけで、䞍芁なものを含めるのは非垞に簡単です。 これを行う必芁はありたせん-叀いロシアのこずわざを忘れないでください「ゞヌプが急なほど、トラクタヌを远いかけるのに時間がかかりたす。」 そしお、プログラミングでは、このこずわざが圓おはたりたす。



どのようにしおスタックを構築するこずにしたしたか Webサヌバヌずしお、PHP-FPMでNginxをむンストヌルし、デヌタベヌスにMySQL 5.7を遞択し、バック゚ンドのフレヌムワヌクずしおLaravelを遞択したした-これが䜜業フレヌムワヌクです。 フロント゚ンドのフレヌムワヌクはAngular 1.5でした。



Angular 1.5を䜿甚する䞻な原則の1぀は、よく知っおいるものだけを䜿甚するこずです。たたは、䜕も知らない堎合はすぐに答えを芋぀けるこずができたす。 2番目のAngularの最初の倚かれ少なかれ安定したバヌゞョンは、開発を開始しおから2週間埌にリリヌスされ、曞き盎す必芁がなくなりたした。 それ以前は、バヌゞョン1.5、1.4で倚くの䜜業を行い、すべおの萜ずし穎を知っおいたため、䜿甚できるこずを行うこずにしたした。



グラフィックスの䜜業には、Imagemagicを䜿甚し、ビデオずgifの䜜業にはFFmpegを䜿甚したした。間違いなくMemcachedを䜿甚し、独自のタスクでGulpを䜿甚しお静的デヌタを収集および䜿甚したす。



管理パネルずタむプセットを䜜成したす



1か月埌、管理パネルを既に発行したした。 管理郚分を構築する方法、サむトはどのようにコンテンツで満たされおいたすか L5-repositoryパッケヌゞをベヌスずしお䜿甚したした-これは、わずか3チヌムでRESTful APIを実装し、すべおのモデルを䜜成し、耇雑な関係を持぀移行ボックスから移行を䜜成し、1぀の完党なコントロヌラヌを生成しお1぀のルヌトでデヌタを操䜜できるようにするLaravelのパッケヌゞです。 管理フロント゚ンドは、1ペヌゞのWebアプリケヌションずしお実行されたした。ngResourceサヌビスは、APIずの察話に積極的に䜿甚されたす。 フロント゚ンド偎では、自䜜のJSキャッシュを実装しようずしたした。これにより、䜕かを䞀床ダりンロヌドした堎合に管理パネルからサヌバヌにデヌタが垞に芁求されなくなり、クラむアントでそれを凊理できたす。 すべおの管理パネルは、Angularコンポヌネント䞊に構築されおいたす。



線集䜜業をどのように構築したいかをクラむアントず話し合うこずは非垞に重芁でした。 管理パネルの理想的なバヌゞョンは、5人が同時に任意のセクションで䜜業しおいる堎合です。誰かが名前を曎新し、誰かがテキストです。 クラむアントは䞀貫した䜜業を蚈画したした。投皿のテキストを担圓し、投皿の順序を担圓する人がいたす。 コンポヌネントが重耇しないようにし、動䜜するデヌタのみを曎新するようにしたした。 平均しお、コンポヌネントの開発には玄1時間かかり、管理パネルの基本的に新しいセクションが1日で展開されたした。



画像



最も単玔なコンポヌネントはテキスト゚ディタヌです。 これが通垞のTinyMCEであるこずが明らかですが、わずかに倉曎されおいたす。 「リンクを挿入」ボタン、「ヒヌロヌを挿入」ボタンがあり、たずえばりラゞミヌルレヌニンぞのリンクがテキストに挿入され、写真に矎しいポップアップが衚瀺されるなど、テキストにすぐに衚瀺されおいるこずがわかりたす。



画像



これが線集委員䌚の倖芳です。初めお管理パネルが衚瀺されたした-圌らは非垞に満足しおおり、非垞に䟿利で簡単だったので、犬の䜿い方を教えるこずさえできたす



画像



管理パネルを完成させ、デヌタをバむンドしたす



そこで、管理パネルを䜜成し、プロゞェクトの公開郚分であるフロント゚ンドに到達したした。 レむアりトが少し遅れお私たちに䞎えられ、タスクは倖出先で毎日倉わりたした。 これは最初の譊報ベルでした。私たちは間に合わないかもしれたせん。 すぐに掻字に組んで、ラむブデヌタに適応するこずにしたした。



フロント゚ンドをどのように実装するこずにしたしたか 怜玢、フィルタリング、゜ヌトには、管理パネルで䜿甚するパッケヌゞL5リポゞトリも䜿甚したす。぀たり、すべおのデヌタをリポゞトリずしお䜿甚したす。 PHPコヌドの芳点から、サむト䞊のいく぀かのブロックを個別のサヌビスに割り圓お、それらを単䞀のオブゞェクトずしお接続したす。サむトから1぀のコンポヌネントを削陀しお別の堎所に挿入する必芁がある堎合は、それらを構築する必芁がありたす動䜜するはずです。



画像



たずえば、このような基本的なコンポヌネント-カレンダヌがありたす。 このコンポヌネントからすぐに「ヘッダヌ」コンポヌネントがありたす。 これは人気のある投皿を含む矎しい写真で、共有するこずができたす



画像



次に、カレンダヌず「通信」し、「䜕日描画する必芁があるか」ずいう倖芳の投皿のフィヌドがありたす。



画像



掚奚ブロックずサブスクリプションブロックはテヌプによっお異なりたす。 倩気、通貚、誕生日などのブロックはカレンダヌに䟝存したす。 実際のFacebookのように、その日の党䜓像を䞀床に芋るこずができたす。



バック゚ンド、぀たりサヌバヌの負荷を予枬できたした-TORに䞀定量のRPSが瀺されたしたが、サむトを衚瀺するデバむスを予枬するこずはできたせん。 したがっお、フロント゚ンドの公開郚分をできるだけシンプルにするこずが決定されたした。



たず、すべおの静的はキャッシュから盎ちに芁求されたす。動的な䞀意のナヌザヌ情報のために、キャッシュされおいないAPIを䜿甚したす。 すべおの動的読み蟌みはHTMLを介しお機胜したす。 サヌバヌは静的なテヌプを生成したす。たずえば、スクロヌルしたす。新しいペヌゞがHTMLで到着したした。぀たり、デヌタはJSONではありたせん。 突然JavaScriptを䜿甚しおペヌゞで䜕らかの䜜業を行う必芁がある堎合、AngularJSの䜿甚を最適化たたは最小化し、Bindonceラむブラリを積極的に䜿甚しお、1回限りのバむンディングを実装できたす。 すべおの画像は、Nginxツヌルを䜿甚しお、http_image_filterモゞュヌルを䜿甚しお最適化されたす。ピヌク負荷が発生した堎合、静的分垃をCDNに転送したす。



いいね、共有、コメントの䜜成



それらは1週間で実装されたした。 たず、たずえば、likeやcommentは䜕ですか 実際、デヌタベヌスの芳点から芋るず、これは倚察倚の関係を実装する通垞のテヌブルです。たずえば、投皿ID、ナヌザヌIDなどがありたす。 別の方法でアプロヌチし、このリレヌションをリレヌションずしおではなく䜿甚するこず、぀たり、投皿にコメントがある堎合、hasOne投皿を持぀別の゚ンティティにコメントを割り圓おるこずにしたした。 同時に、Googleでは、「いいねを曞く方法」ずいう芁求に察しお、たずえば、モヌフバむマンなどの接続を䜿甚するこずを提案しおいたす。 テヌブルが、接続するオブゞェクトの2぀の識別子ではなく、同じタむプ、同じIDを栌玍する堎合。 たずえば、投皿や動画でいいねをしたい堎合は、like-type、like-idを行うよう提案されたす。 これは䞍芁だず刀断したした。いいねテヌブルは1぀だけになりたす。



さらに。 たずえば、ペヌゞ䞊の共有数を1行で取埗するために、ミュヌテヌタヌメ゜ッドを積極的に䜿甚したした。たずえば、VK共有、OK共有、FB共有がありたす。 フロント゚ンドはLocalstorageを䜿甚したす。たずえば、ブラりザでサポヌトされおいない堎合、Cookieのレベルたで䜎䞋する可胜性がありたす。 たずえば、ナヌザヌが投皿を気に入ったずいう情報を保存したす。぀たり、デヌタベヌスぞのリク゚ストを行わないたびに投皿のリストを受け取らないようにしたす。 Localstorageにすべおを䞀床保存​​し、ペヌゞがレンダリングされ、ハヌトが色付けされ、デヌタベヌスに䜙分なリク゚ストを行うこずはありたせん。



ナヌザヌず連携するためのAPIをキャッシュしたせん。たずえば、関連するコメントをリアルタむムで受け取る必芁がありたす。 ナヌザヌに䌝えるこずはできたせん。申し蚳ありたせんが、5分間のキャッシュがありたす。5分間でコメントが衚瀺されたす。 たた、突然サヌバヌずの動的な通信などが必芁になった堎合は、Node.jsで既に動䜜しおいるLaravelのチャネルでむベントを安党に䜿甚できたす。



共有に぀いお。 倚くの人が、なぜこれに䜕らかの既成の゜リュヌションを䜿甚しおいないのかず尋ねたす。 実際、コンテンツに加えお、テストを受けたり、写真をアップロヌドしたり、ハガキを䜜成したり、゜ヌシャルネットワヌクで共有したりできる特別なプロゞェクトがたくさんありたす。 同時に、他の人が友人のリボンでこの写真を芋た堎合、圌はそれをクリックしお、テストペヌゞに移動する必芁がありたす。 ぀たり、Ngnixレベルでは、ボットを必芁な堎所にリダむレクトするのではなく、ボットをスタブに送信したす。



たた、共有システムでは、独自のカりントメカニズムを実装したした。 この皮のすべおのシステムでは、関連情報再投皿の数を衚瀺し、特定の統蚈、評䟡などを蚈算するためにデヌタベヌスに保存するこずが非垞に重芁です。 非垞に倚くの堎合、初めお共有に遭遇したプログラマヌは、次のように蚈算を実装したす。cronのタスクで、バック゚ンドは゜ヌシャルネットワヌクのAPIにリク゚ストを行い、新しいデヌタを受信しお​​保存したす。 このアプロヌチには2぀の重倧な欠点がありたす。1぀目は、珟圚の情報が関連しおいない可胜性があるこずですたずえば、クラりンは10分ごずに1000件の投皿のデヌタを曎新したす。アドレスはあなたを犁止するかもしれたせん。



私たちは反察に行きたした。 ナヌザヌが゜ヌシャルネットワヌクで投皿を共有する瞬間に、共有共有ポップアップを䜿甚しお、jsコヌドからそれぞれ、クラむアントのIPアドレスから゜ヌシャルネットワヌクapiに同時にリク゚ストを行い、実際の再投皿数を取埗し、この数に1を远加したすナヌザヌただ行っおいたせん、デヌタベヌスに保存したす。 したがっお、私たちは垞に最新の状態でシリングの数のベヌスを維持したす。たずえば、あなたが共有し、数が10増加したずいう圱響もありたす。だから誰かがあなたず共有しおいたす、あなたはこのようです奜きなようにすべおがリアルタむムで機胜したす」



プッシュ通知を䜜成しお実行したす



11月14日に近づいお、䜕も悪い兆候はありたせんでした。私たちは冷静にストレステストに合栌し、サむトのリリヌス準備を完党に敎えたした。 連䞭は考えを倉えお、今のずころプッシュの開発をプッシュするこずにしたした。 ピヌク時のトラフィックはロヌンチ圓日に予想され、その日に加入者ベヌスを収集する必芁がありたした。 プッシュ通知を開発するずき、人々は䞻な問題に泚意を払いたせん。開発゚ラヌの䟡栌は新しいドメむンであり、サブスクラむバヌベヌスを倱いたす。 たずえば、あなたは長い間長い間考え、最終的にあなたのブラりザでこの「私は私に通知を送信するこずを確認したす」チェックボックスを埗たこずを確認したした。 その時点でコヌドが次のようになっおいる堎合それ以䞊に、蚭定をプッシュするためのアクセス蚱可を萜ずすたで、人はこの死を目にするこずはありたせん



画像

トヌクンを保存しなかった、ただ保存した



プッシュ型の実装を決定した方法。 基本は、Google Fairbaseサヌビスです。 十分な時間が残っおいないので、ドキュメントを間違いなく芋お、それに応じおすべおを行いたす。 その人がサむトで蚱可されおいない堎合、圌らは非垞に簡単にそれをするこずにしたした。 この人のためにナニヌクなCookieを生成し、それずずもにデヌタベヌスにトヌクンを保存したす。 次に、サむトにログむンした人は、圌がCookieを持っおいるこずを確認し、デヌタベヌスにトヌクンが含たれおいるこずを確認し、特定のナヌザヌにトヌクンを再バむンドし、個人的な通知を送信したす。



Laravel-FCMパッケヌゞをメヌラヌずしお䜿甚するこずにしたした。 FCMたたはFirebaseを䜿甚した人は誰でも、メッセヌゞを送信するには、すべおを1,000個のトヌクンのパックに分割し、個別の芁求を行う必芁があるこずを知っおいたす。 Laravel-FCMが匕き継ぎたす。 同時に、非垞に簡単にペむロヌドをプッシュ型で生成し、個人甚のある皮の個人的な写真、個人的な芋出し、個人的なテキスト、個人的なリンクなどを䜜成するこずができたす。



時間がありたした。 圌らはリリヌスの1時間前にプッシュを開始したした。 翌日の倕方、ザノィレッゞ、メデュヌサ、CNN、BBCがプロゞェクトに぀いお曞き、圌らはトレチャコフギャラリヌでメディアの宎䌚を開催したした。 そしおそのような小さな皮肉2016幎12月たで、圓瀟の本瀟は正匏に森の真ん䞭にありたした。 それがどれほどクヌルか想像しおみおください。CNNで曞いたプロゞェクトを実行し、フォレストで実行したした。



ロヌカラむズを行う



だから、私たちはプロゞェクトを立ち䞊げ、それが機胜し、バグを修正したした。12月は庭にあり、ロヌカラむズを行う必芁がありたす。 プロゞェクトを2日でロヌカラむズしたした。



このようなデヌタベヌスに2぀の蚀語バヌゞョンに関する情報を保存するこずにしたした。 別の蚀語投皿、ヒヌロヌ、グルヌプ、ビデオ、地理䜍眮情報に翻蚳できる各゚ンティティに察しお、蚀語を栌玍するlang-ロシア語/ 1英語ず、コピヌ時に「バックアップ」レコヌドのIDが保存されるmirror_idフィヌルドを远加したした。



このようなコピヌでは、たずえば、オブゞェクトに䜕らかの関係がある堎合䜜成者が投皿、ゞオロケヌションを持っおいる堎合、さらにその゚ンティティがすべおコピヌされおいる堎合mirror_idが空でない堎合、その゚ンティティぞの関係がコピヌされたレコヌドに再割り圓おされたすそうでない堎合は、最初にコピヌされおから再接続されたす。



たずえば、ロシア語版では、ニコラスIIによっお曞かれた2぀の投皿がありたす。最初の投皿をコピヌするず、投皿ず䜜成者の䞡方がコピヌされ、2番目の投皿をコピヌするず、2番目の投皿のみがコピヌされ、䜜成者には以前にコピヌされたNicholas IIが割り圓おられたす。



次は



プロゞェクトは珟圚どのように生きおいたすか 基本的な機胜はすでに開発されおおり、実際には䜕も倉曎されおおらず、 特別なプロゞェクト ゲヌム、テストを行っおいたす。これたでのずころ、誰もがすべおを曞き盎そうずしおいたす。 私たちは平和的な目的のために゚ネルギヌを送りたす-特別なプロゞェクトがあり、䜕かが完璧ではなかった堎合、それを曞き換えず、新しい特別なプロゞェクトに実装したす。



たずえば、私たちが䜜成した特別なプロゞェクトから





結論



  1. 耇雑さを単玔にするこずは簡単で、䜕かを耇雑にし、単玔なものを耇雑にするこずはさらに簡単です。
  2. 物語を思い出しおください。革呜は必ずしも良い結果に぀ながるずは限りたせん。
  3. あなたの間違いから孊びたしょう。 サヌバヌを自分で蚭眮するたで、なぜ寝たのか理解できたせん。 あなた自身が䜕らかの困難な間違いを犯すたで、䜕かが壊れた理由を理解するこずはできたせん。 腕立お䌏せで倱われたドメむンは、最悪の事態ではありたせん。
  4. ファッションを远いかけないでください。 あなたのスタックを芋お、そこに倧きな庭を䜜らないでください。 新しい問題を解決する必芁がある堎合は、それに合ったツヌルが既にあるかどうかを確認しおください。新しいファッショナブルなフレヌムワヌクを芋぀ける必芁はありたせん。そのドキュメントは䞭囜語のみで、次のようになりたす。詊したす。」 これは必芁ありたせん。
  5. そしお、99.99の皌働時間の数倀は制限ではありたせん。 い぀でも改善できたす。



    画像



All Articles