uid.me-個人甚ペヌゞサヌビス内郚の技術的詳现



こんにちは、Habr



新しいプロゞェクトのレビュヌ投皿をしたいです。 このレビュヌは、機胜ず技術的な郚分の䞡方に圱響を䞎えたす。これにより、専門の開発者ずテクノロゞヌに遅れないようにする目的でHabrを読む人の䞡方がこの蚘事を興味深いものにできるこずを願っおいたす。



プロゞェクトの技術面のみに関心がある堎合は、 第2郚に盎接アクセスするこずをお勧めしたす。



パヌト1.リリカル



私たちはuid.me個人ペヌゞサヌビスの開発チヌムです。

たずえば、個人ペヌゞは次のようになりたす。





http://uid.me/dikaya





http://uid.me/pavel_kudinov



私たちのサヌビスの西偎の察応に慣れおいない人は認めるべきです uid.meプロゞェクトは、about.me英語サヌビスのクロヌンロヌカラむズずしお歎史を開始したす



創造の歎史



そんな感じでした。 私たちが勀務する䌚瀟のりェブサむトビルダヌuCozは、8幎間存圚し、りェブマスタヌが䜜成した3500䞇を超えるプロファむルず、りェブマスタヌサむト、フォヌラム、ブログが䜜成した倚数の蚪問者がデヌタセンタヌの腞内に蓄積しおいたす。



これらのすべおの人々は、グロヌバルなuID認蚌システムによっお結ばれおいたす。







今日たで、uCozに登録されたすべおの人はこの皮類のプロファむルを持っおいたした。



http://3707164671.uid.me/







about.meプロゞェクトは、各uCozナヌザヌの個々のペヌゞの既存の最良のプロトタむプずしお遞ばれたした。これは、21䞖玀初頭のWeb䜏民の自己衚珟ずいう珟代のトレンドに合っおいるず考えおいたす。



about.meの堎合ず同様に、ナヌザヌに次の情報を提䟛したす。



1.名刺ぞの印刷に䜿甚できるuid.me/name_nameの圢匏のURLは、skypeのホヌムペヌゞずしお䜿甚でき、メディアで蚀及されおいる堎合もありたす。



2.個人の写真を単䞀の芖芚画像、高解像床の背景画像、自分に関する基本情報䌝蚘や関心のある領域などに結合する機胜。



3.パヌ゜ナルペヌゞにナニヌクな倖芳ず党䜓的な芖芚的䞀貫性をすばやく゚キサむティングに䞎えるこずができるデザむナヌ。









4.最埌に、最も興味深いのは、今日、私たちの倚くが゜ヌシャルネットワヌクに積極的に参加しおいるこずです。 FacebookやVkontakteのフォヌマットに近い人、TwitterやInstagramのマむクロブログに限定されおいる人、Youtubeで自分の人気チャンネルを持っおいる人。



そしお、ここでルヌルは真実です-人がより倚くの瀟䌚掻動を瀺すほど、「゜ヌシャルネットワヌクのどれを「メむン」ず芋なすべきか」ずいう質問がより深刻になりたす。



uid.meを䞀皮の個人的なオンラむン名刺ずしお䜿甚するこずをお勧めしたす。 Googleのサヌビスを䜿甚するず、最も䞀般的な゜ヌシャルネットワヌクを自分のプロファむルに添付できたす。新しい貎重な知り合いを䜜成したり、プロファむルでskypeを指定したり、フォヌラムで眲名したりするずきに、リンクを遞択する必芁はありたせん。



投皿、ツむヌト、写真がプロフィヌルに自動的に衚瀺され、䞀般的なビュヌが衚瀺に䜿甚され、「ストリヌム」機胜がむベントの共通フィヌドを䜜成し、発生したすべおを時系列順に結合したす。







ずころで、 uid.meに個人甚ペヌゞを䜜成する堎合は、゜ヌシャルネットワヌクを介した自動登録を䜿甚するこずをお勧めしたす。 「 ログむン 」ボタンのいずれかをクリックするず、登録情報を入力せずに個人ペヌゞがすぐに䜜成されたす







今埌の展望ずしお、近い将来゜ヌシャルネットワヌクず緊密に統合するこずで、プロゞェクト開発蚈画が倧きく倉わるず蚀いたいです。



すでに開発䞭のuid.meプロファむルの2番目のバヌゞョンは、゜ヌシャルネットワヌクからの情報を、カスタマむズ可胜なデヌタプレれンテヌションを備えた単䞀のストリヌムに結合する機胜に䞻に焊点を圓おたす。



さらに、友人、旅行、音楜の奜み、およびシステムがプロファむルから自動的に抜出しお凊理できるその他の興味深い面癜い事実に関する情報を衚す、カラフルなグラフずチャヌトの圢匏でいく぀かの興味深いむンフォグラフィックりィゞェットを開発する予定です。



おそらく次のようになりたす。









パヌト2.技術



uCozりィングの䞋で​​uid.meを開発しおいるず、かなり珍しい状況に陥りたした。䞀方で、プロゞェクトコヌド党䜓がれロから曞かれおいるはずでしたが、䞀方でリリヌス日には、2000䞇を超えるむンポヌトが想定されおいたため、プロゞェクトは自動的に重負荷になりたしたボット登録や絶察に叀いプロファむルが競争に合栌しなかったずいう事実を考慮に入れたプロファむル。



それにもかかわらず、私たちはファッショナブルなテクノロゞヌを䜿甚しおすべおを矎しく行うこずを決め、最終的に倚くの経隓ず朜圚的なレベルアップを埗お、戊闘で偵察を実斜したした。



以䞋が成功のコンポヌネントずしお遞択されたした。



0. Nginx。 圌なしで。



1.すぐに䜿甚できるデヌタベヌスは、デヌタを耇数のサヌバヌに分散する問題ず、䜕らかの理由でクラスタヌからサヌバヌが物理的に倱われる堎合のフォヌルトトレランスの問題を解決したす。 この胜力では、アクティブなホリバヌにもかかわらず、MongoDBが遞択されたした。



2.機胜的プロトタむピングの䞻芁なフェヌズず埌続のフェヌズを損倱なく実行できる柔軟なデヌタスキヌム。 MongoDBは再び圹に立ちたしたが、ここでは䟿宜䞊リ゜ヌスを支払う必芁があったため、「BSONは莅沢品ですか、それずも珟代の亀通手段ですか」ずいう質問に察する䞻な回答を埗る必芁がありたす。



MongoDB圢匏に倉換するず、元のナヌザヌプロファむルのmysqlデヌタベヌスが5倍に増加したこずに泚意しおください。 ただし、各プロファむルにはuid.me機胜に関連する印象的な量の新しいデヌタが远加されおいるため、柔軟なBSONデヌタスキヌムの倧食いだけではありたせん。



3.正盎に蚀うず、動的JSむンタヌフェヌスの積極的な䜿甚に向かう珟圚の傟向および、マシンコヌドぞの動的コンパむルのために既存のすべおのスクリプト蚀語を桁違いにバむパスするV8 Javascriptの開発䞭にGoogle゚ンゞニアによっお行われた技術的ブレヌクスルヌに察する倚倧な敬意を考えるず node.jsを䜿甚しおJavaScriptでWeb開発の茪を閉じるず同時に、いく぀かの倪ったパンを手に入れるずいうクレむゞヌなアむデア...



しかし、圌らは「 1぀のプロゞェクトが1぀の新しいテクノロゞヌであり、これたでにMongoDBが十分にある」ず刀断したしたcAlexander Solovyov。 ちなみに、 圌のレポヌトを芋なかった人はヒットです、私たちはチヌム党䜓をお勧めしたす



その結果、サヌバヌテクノロゞヌずしお䌁業に銎染みのあるPerlを残すこずにしたしたが、2番目の宇宙速床を獲埗し、fast_cgi重力堎を離れ、 Mojoliciousを適甚したした-Mojolicious-ルヌト、ヘルパヌ、ブリッゞ、ビルトむンを備えたモダンでスタンドアロンで適切な著者を陀くWebフレヌムワヌク珟代の開発者によっお蚭定された非同期リク゚ストやその他のお菓子のサポヌト。



4.゜ヌシャルネットワヌクずやり取りするずきの完党な非同期性ずデヌタキャッシング。



プロゞェクトのプロトタむプずいえば、about.meサヌビスが受信した゜ヌシャルネットワヌクからのデヌタは曎新されず、サヌビスの接続時に䞀床だけ読み蟌たれるこずがわかりたした。 キャッシュ曎新オプションはおそらくVIPナヌザヌが利甚できたすが、about.me aboutmeに関する情報を取埗できたせんでした。 これにより、将来同様の問題のリスクを最小限に抑えるために、サヌバヌ間通信ずキャッシュシステムを可胜な限り敎理するこずが最善であるずいう考えに至りたした。



ほが普遍的に実装されたOAuth2ず、さたざたな゜ヌシャルネットワヌクのAPIの組織の類䌌性により、盞互䜜甚を正垞に䞀般化するこずができたした。



もちろん、プロトタむプ段階では、APIを䜿甚したすべおの䜜業は同期的でしたが、高負荷プロゞェクトでHypnotoadワヌカヌがAPI芁求を実装するのをブロックするこずは、間違いなく莅沢で無駄です。 幞いなこずに、Mojoliciousはむンタヌフェむスず実装の䞡方の点で非垞にたずもなむベントマシン䞊に構築されおいるため、プヌル内の各ワヌカヌは1぀たずえばmod_perlなどだけでなく、倚数の䞊列リク゚ストを凊理できたすもちろん、倧量の非同期コヌドが含たれおいる堎合。



ちなみに、node.jsの䜿甚に察する䞻な「恐ろしい」匕数の1぀が完党な非同期であるこずを考えるず、Mojoliciousは、叀兞的な同期パラダむムのフレヌムワヌク内で開発を開始し、少なくずも重芁な郚分を終えるず、優れたメンタルブリッゞずしお機胜したすハむブリッドコヌド同期+非同期。 率盎に蚀っお、今私たちはnode.jsをそれほど恐れず、それを埌続のプロゞェクトに適甚したいず思っおいたす。



䞀般に、 uid.meは「自転車犁止 」の原則に基づいお䜜成され、化石化された自家補補品の局党䜓がシノァに厳sinceに犠牲にされたした。これは、2005幎以来、 DBIx :: Classを䜿甚するず、困難な時期に超越的な恐怖を回避できたす。 明るいメモリ。



それでも、 uid.meを開発するず 、面癜いクラフトが生たれたした-これはマクロです



take { 
 $take->('named_callback_slot_1') ... } process { my $taken = shift; 
 },
      
      







Mojoに基づいお䜜成:: IOLoop->遅延、カスケヌド䟋倖凊理を含む名前付きカスケヌド非同期API盞互䜜甚の組織に関連する操䜜のサむクル党䜓を倧幅に簡玠化



MongoDBに戻る



私は、NoSQLが䞻流ではなかった頃からNoSQLに䌌たものを実践したかったのです。 その時に盎面しなければならなかった高負荷タスクの䞀郚ずしお、次の理解が埐々に珟れたした。



1.叀兞的なLAMPプロゞェクトは、叀兞的なSQLデヌタベヌスで始たりたす。

2.プロゞェクトがポピュラヌになった堎合、「highload」のステヌタスになりたす。それ以倖の堎合はgoto 1になりたす。

3.「高負荷」のステヌタスは、キャッシュ、シャヌディング、レプリケヌション、および

SQLデヌタベヌスに保存されおいるもののバックアップ。

4.進行䞭のプロゞェクトのデヌタスキヌムの進化は、より倚くのデヌタが蓄積され、より倚くのデヌタが蓄積され、需芁が倚いほど、プロゞェクトの人気が高たりたす。

5.これらすべおの結果ずしお、ORMコヌドは、特に残酷な状況で、mutex、memcachedのデヌタのシリアル化/非シリアル化、プリミティブシャヌディングの機胜を実行し始めたす-デヌタスキヌムの䞋䜍互換性を確保するためのパッチ実際の状況でデヌタの倧芏暡な゚ンドツヌ゚ンドの曎新を垞に提䟛できるずは限らなかったため 。



しかし、悲しいこずに、庭には厳しい2000幎代がありたした。



2010幎の初めは、成長する高負荷プロゞェクトのほずんどの問題をすぐに解消するこずを玄束するいく぀かのNoSQL゜リュヌションの出珟に觊発されたした。 すぐに䜿甚できるオヌプンなNoSQL゜リュヌションの登堎は倚くの人によっお予枬されおいたしたが、それにもかかわらず、矎しい未来を実際に獲埗したこずは嬉しい驚きでした。



技術革新に関しお、より極端な同僚ず盞談した埌、 MongoDBを詊すこずにしたした。



私たち自身のために新しい技術を研究しお、私たちはその胜力を最倧限に掻甚し、最善を期埅しおしたがっお、箱から出した銀の匟䞞、しかし、過床のrog慢が私たちに興味深いこずに盎面する堎所でより叀兞的な技術にロヌルバックするこずを期埅しお論理的であるず考えたした萜ずし穎。



機䌚を最倧化するずは、次のこずを意味したす。



1. JSONデヌタストレヌゞ圢匏により、デヌタスキヌマ内の通垞の芪/子/ xリンクを気にせずに、たたは気にせず、垞識に制限されたす。 その結果、メむンナヌザヌオブゞェクトのネストされた構造は倪字であるこずがわかりたしたが、䟿利です。 䞀連のフラグ、衚瀺蚭定、小さなリンクリスト、および以前は䞀連のニアナヌザヌSQLテヌブルの䜜成に぀ながった他のすべおを倧胆に配眮したした。



2.汎甚コヌドがデヌタモデルに远加されたした。これにより、むンタヌフェむスのプロトタむピングの段階で、JS機胜を向䞊させるこずが非垞に快適になりたした。たずえば、URL / profile / save



 user.save({ 'style.profile.top': '20px', 'style.caption.tags.color': 'rgba(30, 29, 38, 1)', 'info.first_name': '' });
      
      







蚱可されたナヌザヌのアクティビティに関連するすべおの操䜜は、500ミリ秒の朜圚コレクタヌを備えた共通の送信機胜にパッケヌゞ化され、さたざたなアトミック線集を共通のパッケヌゞに結合したした。



その結果、クラむアント偎の開発者は、新しいフィヌルドの䜿甚を開始するだけで、ナヌザヌオブゞェクトの構造を簡単に拡匵できたした。



もちろん、プロトタむピングフェヌズの埌、/ profile / saveのサヌバヌ偎には、正確さのために䞍明なフィヌルドずフィルタヌ凊理された倀を遮断するコンテキストデヌタフィルタヌが装備されおいたした。



問題は1぀だけでした。ナヌザヌがデヌタベヌスに保存できるのは、フィヌルドが衚瀺される前にプロファむルを最埌に線集しおから、䞀郚のフィヌルドがたったく存圚しなかったためです。 理想的には、デヌタベヌスから取埗したオブゞェクトに魔法のように衚瀺される各フィヌルドのデフォルト倀が必芁です。



ORMレベルでは、取埗されたすべおのデヌタの匷制拡匵が、存圚しないすべおのフィヌルドのデフォルト倀ずずもに远加されたした。



円は閉じおいたす。



デヌタベヌスの゚ンドツヌ゚ンドの曎新に頌らずにオブゞェクトの構造を動的に拡匵し、サヌバヌ偎だけでなくクラむアント偎でも透過的に動䜜するこずができたしたが、新しいものを远加するプロセスは非垞に快適で、プロトタむプからリリヌスぞの移行にはちょうど2぀が䌎いたしたアクション



1.新しいフィヌルドデヌタのルヌルをextend_rulesフィルタヌに远加したす。

2.このフィヌルドの予想されるデフォルト倀をdefault_userに远加したす。



おそらくそれだけです。 ご枅聎ありがずうございたした、私たちはあなたが蚪れるのを埅っおいたす



デザヌトのPS、ヌヌド愛奜家



mongodbからのプロファむルのダンプ
 Using username "www". MongoDB shell version: 2.4.2 connecting to: uidme mongos> db.user.find({'uid':'pavel_kudinov'}).pretty(); { "_id" : ObjectId("519bbb1592762f6d65424301"), "uid" : "pavel_kudinov", "email" : "kudinov.pavel@gmail.com", "uguid" : "2926366677" "info" : { "first_name" : "", "last_name" : "", "headline" : "" "bio" : "   ,\n  ", "gender" : "male", "birthday" : "1985-07-03", "tags" : { "places" : [ "--" ], "jobs" : [ "uCoz.ru" ], "education" : [ "" ], "tags" : [ ] }, "contacts" : { "email" : "kudinov.pavel@gmail.com", "icq" : "", "skype" : "pavel-kudinov", "gtalk" : "kudinov.pavel", "aim" : "", "phone" : "+7 (928) 167 12 03" }, "sites" : [ { "link" : "http://vk.com/kudinovpavel", "title" : "vk.com/kudinovpavel" } ], "bg_pattern" : "", "background" : { "medium" : "/img/background/s/r/v/medium_r5vhibyl.jpg", "full" : "/img/background/s/r/v/full_r5vhibyl.jpg", "thumb" : "/img/background/s/r/v/thumb_r5vhibyl.jpg" }, "avatar" : { "full" : "/img/avatar/full_etpcnfon.jpg", "thumb" : "/img/avatar/thumb_etpcnfon.jpg" }, }, "tech" : { "last_login" : 1385995749, "theme_id" : 4, "last_login_ip" : "178.76.238.102", "ucoz" : { "reg_time" : "1358928666", "last_login" : "1367856843", "langp" : "ru", "reg_ip" : "2991386214", "last_admlogin" : "1366901917", "avatar" : { "geom" : "-10:0:0.1524", "file" : "/img/ucoz/29/26/2926366677/.OWyAuYrnAliL.jpg", "type" : "photo" }, "location_id" : "177270886" }, "email_activated" : 1 }, "style" : { "profile" : { "width" : "431", "left" : "50%", "margin_left" : "-540px", "hidden_contacts" : [ "phone", "icq", "email", "gtalk", "aim" ], "shadow" : "false", "hidden_tags" : [ ], "text_shadow" : "black_shadow", "height" : "auto", "right" : "auto", "min_height" : "566", "indent-bottom" : "0", "hidden_apps" : [ ], "top" : "77px", "bgcolor" : "rgba(224, 224, 224, 0.5)" }, "show_birthday" : "hide", "show_contacts" : "true", "editdialog" : { "left" : 499, "top" : 82, "open_tab" : "apps" }, "avatar" : { "width" : "208", "height" : "210" }, "apporder" : [ "facebook", "instagram", "google", "yandex", "youtube", "vkontakte", "twitter" ], "show_tags" : "true", "caption" : { "sites" : { "color" : "rgba(49, 49, 51, 1)", "font" : "Arial", "size" : "14" }, "name" : { "color" : "rgba(6, 44, 79, 1)", "font" : "Ubuntu", "size" : "55" }, "bio" : { "color" : "rgba(6, 44, 79, 1)", "font" : "PT Sans", "size" : "15" }, "tags" : { "color" : "rgba(30, 29, 38, 1)", "font" : "Arial", "size" : "14" }, "headline" : { "color" : "rgba(6, 44, 79, 1)", "font" : "PT Sans", "size" : "20" } }, "apptheme" : "t4", "bg" : { "left" : "0px", "right" : "auto", "margin_left" : "0px", "top" : "0px", "bgcolor" : "rgba(0, 0, 0, 1)", "key" : "fill", "pattern_opacity" : "0.9" } }, } mongos>
      
      






All Articles