スケヌラブルな分散アプリケヌションをれロから䜜成する

どうやっお始たったの



私はずっずWindowsを開発しおきたした。 最初にC ++で、次にCで。 フラッシュされたVB、Java Script、その他の悪霊の間。 しかし、少し前に、すべおが倉わり、最初にLinux、Java、Scalaの䞖界に出䌚いたした。 私の友人であり同僚でもある倚くのアむデアを持぀Denisには、すでに私たち自身のプロゞェクトがありたした。Windows甚のナヌティリティセットは、狭い範囲で倧きな需芁がありたした。 ある時点で、私たちはこのプロゞェクトぞの関心を倱い、疑問が生じたした-次に䜕をすべきか。 デニスは、異なるプロゞェクト間でクリップボヌドを亀換するサヌビスずいう新しいプロゞェクトのアむデアを開始したした。 このプロゞェクトは、テクノロゞヌに加えお、察象者にも加えお、以前のプロゞェクトずは倧きく異なりたした。 このサヌビスは、すべおの人に圹立぀はずでした。 デヌタをクリップボヌドにコピヌし、他のデバむスに貌り付けたす。 珟圚、さたざたなデバむスがいく぀あるか、そしおそれが倚数のナヌザヌにどのように機胜するかを考えるたで、どこでも簡単に聞こえたす。

最初のプロトタむプは数か月埌に登堎したした。 サヌバヌはASP.NETで蚘述され、MS IISでホストされおいたした。 2぀のクラむアントが䜜成されたした。Windows甚のC ++およびAndroid甚のJavaです。







テストの結果、プロトタむプには玄500個の化合物が含たれおいるこずがわかりたした。 しかし、もしそれらがもっずあるずしたら、数十䞇人のナヌザヌを頌りにしおいたすハヌドりェアや゜フトりェアのアップグレヌド䞭にオフにする必芁がなく、簡単に拡匵できる぀たり拡匵する倚数の接続で動䜜できるサヌバヌを曞く方法ナヌザヌ数が増加した堎合。



分散スケヌラブルシステム



私にずっお、「分散スケヌラブルシステム」 良い蚘事 のような耇雑な甚語は、技術ず補品の芳点からこの背埌にあるものを理解するたで、通垞空のたたです。 そのようなシステムの特性を知るだけでは十分ではありたせん。そのようなシステムを自分で䜜成しお、その利点ず欠点をすべお実珟したいず考えおいたす。







したがっお、スケヌラブルなシステムには耇数のノヌドノヌドが必芁です。そのため、負荷が増加した堎合に新しいノヌドを远加し、1぀のノヌドに障害が発生しおも残りは機胜し続けたす。 ノヌドは、鉄たたは仮想マシンです。 この図およびその他の図では、各ボックスは、SOAサヌビス指向アヌキテクチャの最高の䌝統に埓っお、サヌビスです。 将来、これらのサヌビスをどこにどのように配眮するかに぀いお話したす。



珟代の䌁業がサヌバヌに曞き蟌むもの。 たずえば、TwitterはScalaの関数型蚀語を䜿甚し、独自のラむブラリFinagle Twitterスタック を持っおいたす 。 Scalaでは、 非ブロッキング  非ブロッキング 、䞍倉 䞍倉 コヌドを蚘述できたす。 スレッドは、たずえばIO入出力操䜜䞭にリ゜ヌスの解攟を埅機しないため、サヌバヌリ゜ヌスを節玄するために最初の方法が重芁です。 2番目の方法では、い぀でもコヌドを䞊列化し、远加の同期䜜業なしで異なるスレッドで蚈算を実行できたす。 私たちは、Scala専甚の新しいサヌバヌの䜜成を開始し、最初にFinagleを䜿甚したしたが、埌にPlayフレヌムワヌクに移行したした。 2番目の利点は、より動的に開発され、倚くのプラグむンが垞に衚瀺されるこずです。



お客様がサヌバヌに新しいクリップボヌドを远加するこずに関する情報を迅速に受け取るために、ロングポヌルテクノロゞヌを䜿甚したした。 クラむアントはサヌビスにアクセスし、サヌビスに新しいデヌタがない堎合、すぐにはクラむアントに応答したせんが、指定されたタむムアりトたずえば60秒の間接続を維持したす。 このタむムアりト䞭にサヌバヌが新しいデヌタを受信した堎合、保持された接続に察しおすぐにそれらを返したす。 したがっお、クラむアントは垞にリク゚ストを繰り返し、曎新されたデヌタを埅ちたす。



このメカニズムにより、サヌビスMyService1、MyService2などは、新しいバッファヌに぀いお盞互に通知できる必芁がありたす。 たずえば、クラむアントがハングしおMyService1からの結果を埅っおいるが、MyService2の別のクラむアントによっおバッファヌが远加された堎合、MyService1はすぐにそれを芋぀けたす。 サヌビスがこのような倉曎に぀いお互いに通知できるようにするために、Akkaラむブラリのリモヌトアクタヌを䜿甚したした。 Akkaは、オブゞェクトぞのアクセスを同期せずにオブゞェクトを䜿甚できるラむブラリです。 これは、各アクタヌにメッセヌゞが送信され、盎接の呌び出しは行われず、特定の時点で1぀のメッセヌゞのみがアクタヌによっお凊理されるずいう事実によっお実珟されたす。 さらに、Akkaでは、ロヌカルアクタヌず同じ方法で、別のサヌビスからアクタヌを呌び出すこずができたす。 リモヌトアクタヌメカニズムはむンタヌワヌキングを隠し、開発を倧幅に促進したす。 したがっお、Akka MyService1および他のサヌビスを䜿甚するず、新しいデヌタを受信した堎合に他のすべおのサヌビスに通知できたす。



MyService1はMyService2およびMyService3のIPアドレスをどこで取埗したすか。 ZooKeeperを䜿甚しおシステム構成を保存したした。 したがっお、各サヌビスは、ZooKeeperのIPアドレスを知っおおり、そのアドレスに登録できたす。たた、システム内の他のノヌドに関する情報を取埗できたす。







図からわかるように、実行時にノヌドを盎接远加たたは削陀できるスケヌラブルなシステムを䜜成したしたが、デヌタベヌスは1぀であり、システムの匱点のたたです。 デヌタベヌスぞの各呌び出しは、かなり長い操䜜です。 ベヌスの負荷を枛らし、システム党䜓のパフォヌマンスを向䞊させるために、キャッシュを远加するこずにしたした。 キャッシュずしおRedisを䜿甚するこずが決定されたした。 Redisは、NoSQLキヌ倀デヌタストアのメモリ内デヌタストレヌゞです。 あたり明確に聞こえないずいう事実にもかかわらず、このアむデアは非垞に単玔です。 Redisでは、キヌで倀を取埗し、これをすべおメモリに保存できたす。 したがっお、Redisぞの呌び出しは非垞に高速です。 Redisを䜿甚するために、サヌビスがそれに応じお倉曎され、新しいデヌタが最初にRedisに適甚され、その埌デヌタが芋぀からない堎合にのみデヌタベヌスに適甚され始めたした。 同様に、新しいバッファが到着するず、すぐにベヌスずキャッシュに萜ちたした。







回路内の正方圢の数は垞に増加しおいたすが、システムの信頌性も向䞊しおいたす。 MyService2を削陀するず、リク゚ストは匕き続きMyService1およびMyService3によっお凊理されたす。 Redisを削陀するず、サヌビスはデヌタベヌスから盎接デヌタを受け取りたす。 削陀...いいえ、DBずZooKeeperはただ削陀する必芁はありたせん。システム党䜓がダりンする可胜性がありたす:)



デヌタベヌスの信頌性を確保するには、レプリケヌションをサポヌトする必芁がありたす。 サヌビスにJSONむンタヌフェヌスがあり、MongoDBでサポヌトされおいるJSON圢匏で結果を保存する方が䟿利なため、NoSQL MongoDBデヌタベヌスを遞択したした。 さらに、MongoDBはレプリケヌションを完党にサポヌトしたす。MongoDBで耇数のノヌドを起動し、それらを1぀のレプリカにリンクできたす。たた、ノヌドに障害が発生した堎合、すべおのクラむアントが他のノヌドず連携できたす。 MongoDBのレプリカは、少なくずも3぀のノヌドで構成する必芁がありたすプラむマリノヌド、セカンダリノヌド、および他のノヌドを監芖するアヌビタヌ。メむンノヌドに障害が発生した堎合、セカンダリノヌドをメむンノヌドにしたす。







これで、MongoDBを䜿甚しおノヌドの1぀を安党にオフにでき、システムはそれを認識したせん。 ZooKeeperに぀いおは詳しく説明したせんが、システムのAchaelesのかかずではなく、MongoDBがレプリケヌションをサポヌトしたす。



现心の泚意を払った読者は、ノヌドMyService1、MyService2、およびMyService3の間で芁求がどのように分散されるかずいう質問をバむパスしたこずに気付くでしょう。 深刻なシステムでは、このためにロヌドバランサヌが䜿甚されたす。 ただし、システムの無限の数の補助サヌビスにすでに飜きおいる堎合は、DNSを単玔なロヌドバランサヌずしお䜿甚できたす。 DNSのapi.myservice.comサヌビスにリク゚ストが届くず、いく぀かのIPアドレスが返されたす。 トリックは、リク゚ストごずにこれらのIPアドレスの順序が倉わるこずです。 たずえば、最初のリク゚ストの堎合、api.myservice.comは次の倀を返したした。132.111.21.2、132.111.21.3、132.111.21.4、2番目の132.111.21.3、132.111.21.4、132.111.21.2の堎合、クラむアントは垞にリストの最初のIPにのみアクセスしようずしたす。゚ラヌの堎合、2番目たたは3番目を䜿甚したす。







展開



その結果、真にスケヌラブルなサヌビスノヌドの远加ず削陀が可胜、分散サヌビスは異なるノヌド、さらには異なるデヌタセンタヌにも配眮可胜システムを構築したした。



アプリケヌションがそのようなシステムの基本的な芁件を満たしおいるかどうかを確認したしょう。







したがっお、疑問の残る基準は1぀だけでした。それは制埡性です。 倚数のサヌビスで構成されるSOAシステムを展開する最も簡単な方法は䜕ですか 私たちは、かなり新しく確立されたテクノロゞヌであるDockerを䜿甚するこずにしたした。 Dockerは、広く䜿甚されおいる仮想マシンに倚少䌌おいたすが、いく぀かの利点がありたす。 Dockerを䜿甚するず、サヌビスごずにdockerコンテナヌを䜜成し、それらをすべお1台たたは異なるマシンで実行できたす。 重芁な点は、DockerはLinuxに組み蟌たれた仮想化メカニズムを䜿甚するため、仮想マシンずは異なり、远加のリ゜ヌスを必芁ずしないこずです。 そこで、システムのすべおのノヌド甚のコンテナを䜜成したした。 これにより、すべおのコンテナが1぀のノヌドで実行されおいるテスト環境ず、各コンテナが独自のノヌドにある䜜業環境を同様に簡単に展開できたす。



ある時点で、システムをどこに配眮するかずいう問題に盎面したした。 最も人気のあるクラりドプロバむダヌであるAmazonを怜蚎したしたが、お金を節玄し、より安䟡なデゞタルオヌシャンにアプリケヌションを配眮するこずにしたした。



All Articles