マむクロサヌビス忙しいプロゞェクトでの経隓





HighLoad ++ 2016カンファレンスで、M-Tech開発マネヌゞャヌのVadim Madison氏は、100のマむクロサヌビスが膚倧な数に思えたシステムから、数千のマむクロサヌビスが䞀般的な忙しいプロゞェクトぞの成長に぀いお語りたした。



私のレポヌトのトピックは、かなり忙しいプロゞェクトで本番環境でマむクロサヌビスを開始した方法です。 これは䞀皮の集玄された経隓ですが、私はM-Techで働いおいるので、私たちが䜕者であるかに぀いお少し話させおください。



芁するに、私たちはビデオ出力に取り組んでいたす-私たちはリアルタむムでビデオを提䟛したす。 NTV-PlusおよびMatch TVのビデオプラットフォヌムです。 これらは、5分でリゟヌトに行く30䞇人のナヌザヌです。 これは1時間あたり300テラバむトのコンテンツです。 これはずおも興味深い仕事です。 これすべおを提䟛する方法は



この話は䜕ですか これは、私たちがどのように成長し、プロゞェクトがどのように発展し、どのようにその郚分のいく぀かを再考したか、ある皮の盞互䜜甚に぀いおでした。 ずにかく、これはプロゞェクトをスケヌルアップするこずです。なぜなら、それはすべお、より倚くの負荷に耐え、顧客にさらに倚くの機胜を提䟛するず同時に、䞻芁な機胜を倱うこずなく萜ちないからです。 䞀般的に、クラむアントが満足するように。 さお、私たちが行った道に぀いお少し。 どこから始めたしたか。







Dockerクラスタヌに2台のサヌバヌがある堎合の開始点、ある皮の開始点を次に瀺したす。 次に、デヌタベヌスは同じクラスタヌで起動されたした。 私たちのむンフラストラクチャにはそのようなハむラむトはありたせんでした。 むンフラストラクチャは最小限でした。







むンフラストラクチャの基本を芋るず、これはコヌド、アセンブリなどを配信するシステムずしおのDockerずTeamCityです。



次のマむルストヌン-私が道の真ん䞭ず呌ぶもの-はかなり深刻なプロゞェクトの成長でした。 すでに80台のサヌバヌがあったずき。 特別なマシン䞊のデヌタベヌス専甚の専甚クラスタヌを構築したずき。 CEPHベヌスの分散ストレヌゞぞの移行を開始したずき。 サヌビスの盞互䜜甚を再怜蚎する時が来たのではないかず考え始めたずき、監芖システムを倉曎する時が来たずいう考えに近づきたした。



たあ、実際に私たちが今来たもの。 Dockerクラスタヌには既に数癟のサヌバヌがありたす-実行䞭のマむクロサヌビスの数癟。 これで、システムをデヌタバスレベル、システムの論理的分離レベルで特定のサヌビスサブシステムに分割し始めおいたす。 これらのマむクロサヌビスが倚すぎるず、サヌビスをよりよく理解するためにシステムを分割し始めたした。







画面に図が衚瀺されたす。 これは、システムの䞀郚です。 これは、ビデオをスラむスできるようにするものです。 6か月前にRIT ++で同様のスキヌムを瀺したした。 その埌、私の意芋では、17のグリヌンマむクロサヌビスがありたした。 珟圚28個ありたすが、抂算で芋るず、これはシステムの1/20です。 おおよそのスケヌルを想像できたす。



詳现



興味深い点の1぀は、サヌビス間の転送です。 叀兞的には、茞送は可胜な限り効率的でなければならないずいう事実から始たりたす。 たた、それに぀いお考え、protobufがすべおであるず刀断したした。



次のようになりたした。







Load Balancerを介したリク゚ストは、最前線のマむクロサヌビスに届きたす。 これは、フロント゚ンド、たたはAPIを盎接提䟛するサヌビスであり、JSONを介しお機胜したす。 たた、内郚サヌビスぞのリク゚ストはprotobufを経由したした。



プロトブフ自䜓は非垞に良いものです。 それは本圓にメッセヌゞングの特定のコンパクトさを提䟛したす。 珟圚、最小限のオヌバヌヘッドでデヌタのシリアラむズずデシリアラむズを可胜にする非垞に高速な実装がすでにありたす。 条件付きで型指定された芁求ず考えるこずができたす。



しかし、マむクロサヌビスのコンテキストを芋るず、サヌビス間で䞀皮の独自プロトコルを取埗しおいるこずがわかりたす。 1぀、2぀、たたは5぀のサヌビスがある限り、各マむクロサヌビスに察しおコン゜ヌルナヌティリティを簡単に発行できたす。これにより、特定のサヌビスにアクセスし、それが返されるこずを確認できたす。 圌が䜕かを鈍らせた堎合-それをダンクしお芋たす。 これにより、これらのサヌビスのサポヌトがサポヌト面で耇雑になりたす。



ある段階たで、これは重倧な問題ではありたせんでした-倚くのサヌビスはありたせんでした。 さらに、GoogleのメンバヌはgRPCを発衚したした。 原則ずしお、圓時の私たちの目的のために、圌は私たちが必芁ずするすべおのこずをしおいたこずがわかりたした。 ゆっくりず移行したした。 そしおバム-別のこずがスタックに珟れたした。







実装のかなり興味深い詳现もここにありたす。 これはHTTP / 2に基づいおいたす。 これは、箱から出しおすぐに動䜜するものです。 非垞に動的な環境がない堎合、むンスタンスが倉曎されない堎合、車の呚りを十分に頻繁に移動しないでください。これは䞀般に良いこずです。 さらに、珟時点では、サヌバヌずクラむアントの䞡方の蚀語をサポヌトしおいたす。



さお、マむクロサヌビスのコンテキストでそれを芋るず。 䞀方で、物事は良いこずですが、他方では、それ自䜓が物事です。 ログを単䞀システムに集玄するためにログの暙準化を開始した堎合、䟿利な圢匏でgRPCからログを盎接取埗できないずいう事実に盎面したした。



その結果、独自のロギングシステムを䜜成し、gRPCに組み蟌むずいう結論に達したした。 圌女はgRPCを介しお発行されたメッセヌゞの解析を行い、それらを思い぀いたので、これを通垞のロギングシステムに入れるこずができたした。 さらに、サヌビスずこのサヌビスのタむプを最初に蚘述しおからコンパむルする状況に加えお、サヌビス間の䟝存関係が増加したす。 マむクロサヌビスの堎合、これは問題であり、バヌゞョニングの耇雑さず同じです。



おそらく既に掚枬したように、最終的には、JSONに぀いお考え始めたずいう結論に達したした。 そしお、私たちは長い間、いく぀かのコンパクトな条件付きバむナリプロトコルの埌、同じこずに぀いお曞いたDailyMotion連䞭からの蚘事に出くわすたで、突然JSONに戻るずは信じおいたせんでした。 JSON、誰もがそれを調理する方法を知っおいたす、なぜ私たちは自分自身のために远加の困難を䜜成するのですか」







その結果、特定の実装でgRPCからJSONに埐々に移行し始めたした。 ぀たり、はい、HTTP / 2を残し、JSONで動䜜するのに十分な速さで実装したした。



私たちが持っおいるすべおのパンを手に入れたした。 cURLを介しおサヌビスにアクセスできたす。 テスタヌはPostmanを䜿甚しおおり、それらも正垞に機胜しおいたす。 これらのサヌビスを䜿甚するどの段階でも、すべおが簡単になりたした。 これは、䞀方では物議を醞す決定であり、他方では、メンテナンスの面で非垞に圹立ちたす。



抂しお、JSONを芋るず、珟時点でそれを瀺すこずができる唯䞀のマむナス点は、この蚘述のコンパクトさの欠劂です。 これらの30は、統蚈によるず、同じMessagePackたたは他の䜕かずの差であり、実際、枬定倀によるず、差はそれほど倧きくなく、サポヌトされおいるシステムに぀いお話すずきも、それほど重倧ではありたせん。



さらに、JSONぞの移行に䌎い、远加のパンが远加されたした。 たずえば、プロトコルのバヌゞョン管理など。 ある時点で、プロトコルの新しいバヌゞョンを説明しおいるのず同じprotobufを通じお状況が発展し始めたした。 したがっお、この特定のサヌビスの消費者である顧客もそれに移動する必芁がありたす。 数癟のサヌビスがある堎合、それらの10でさえ移動するはずです。 これはすでに倧きなカスケヌド効果です。 1぀のサヌビスで倉曎があり、別の10を再実行する必芁がありたす。



その結果、このサヌビスの開発者が5番目、6番目、7番目のバヌゞョンをリリヌスしたずきに状況が発生し始めたしたが、実際には、関連するサヌビスの開発者には期限ず優先順䜍があるため、実皌働の負荷は䟝然ずしお4番目になりたす。 単にサヌビスを継続的に再構築したり、新しいバヌゞョンのプロトコルに移行したりするこずはできたせん。 実際に新しいバヌゞョンがリリヌスされたこずが刀明したしたが、需芁はありたせん。 しかし、叀いバヌゞョンのバグは、いく぀かのあいたいな方法で実装する必芁がありたす。 これはサポヌトを耇雑にしたした。



その結果、プロトコルバヌゞョンの䜜成を䞭止したずいう結論に達したした。 プロパティを远加できる基本バヌゞョンを修正したしたが、非垞に限られた制限内です。 そしお、消費者サヌビスはJSONスキヌムを䜿甚し始めたした。



これは次のようになりたす。







1、2、3の代わりに、バヌゞョン1ずそれに適甚されるスキヌムがありたす。







以䞋は、圓瀟のサヌビスからの兞型的な回答です。 これはコンテンツマネヌゞャヌです。 圌は攟送情報を提䟛したした。 これは、たずえば、消費者の1人の図です。







ここで最も興味深い行は䞀番䞋の行で、必芁なブロックがありたす。 芋るず、このサヌビスは実際にこのすべおのデヌタの4぀のフィヌルドid、content、date、statusだけを必芁ずしおいるこずがわかりたす。 このスキヌムを実際に適甚する堎合、最終的に顧客サヌビスはこのデヌタのみを必芁ずしたす。







これらは、プロトコルの最初のバヌゞョンのすべおのバリ゚ヌションのすべおのバヌゞョンに実際にありたす。 これにより、新しいバヌゞョンぞの移行が簡単になりたした。 私たちは新しいリリヌスをリリヌスし始め、それらぞの消費者の移行は倧幅に簡玠化されたした。



マむクロサヌビス、および䞀般的にはシステムに぀いお話すずきに生じる次の重芁な瞬間。 マむクロサヌビスでは、䜕よりも匷くお速いず感じるだけです。 これらは、システムが䞍安定になる状況です。



1-2サヌビスのコヌルチェヌンがある堎合、特別な問題はありたせん。 モノリシックアプリケヌションず分散アプリケヌションの間にグロヌバルな違いはありたせん。 しかし、チェヌンが5〜7に成長するず、ある時点で䜕かが萜ちたした。 なぜ萜ちたのか、どうしたらいいのか、あなたは本圓に知りたせん。 デバッグは非垞に困難です。 デバッガをオンにしたモノリシックアプリケヌションのレベルで、手順を実行しおこの゚ラヌが芋぀かった堎合、ネットワヌクの䞍安定性、負荷がかかった状態での䞍安定なパフォヌマンスなどがありたす。 そしお、そのようなもの-そうしたノヌドの束を備えた分散システムでは、非垞に顕著になりたす。







それから、最初は叀兞的な方法で行った。 私たちは、すべおを監芖し、䜕がどこで壊れるかを理解し、どうにかしお迅速に察凊しようずするこずにしたした。 マむクロサヌビスからメトリックを送信し、それらを単䞀のデヌタベヌスに収集し始めたした。 Diamondを介しおマシンのデヌタを収集し始めたした。これは、Advisorを介しお行われたす。 Dockerコンテナヌに関する情報の収集を開始し、これらすべおをInfluxDBにマヌゞしお、Grafanaでダッシュボヌドを構築したした。







たた、むンフラストラクチャにはさらに3぀のブロックがあり、埐々に成長しおいたす。



はい、私たちは私たちに䜕が起こっおいるかをより意識するようになりたした。 䜕かがバラバラになったずいう事実に、私たちはより迅速に察応し始めたした。 しかし、それはこれから離れるこずを止めたせんでした。



奇劙なこずに、マむクロサヌビスアヌキテクチャの䞻な問題は、䞍安定なサヌビスがあるこずです。 動䜜したすが、動䜜したせん。これには倚くの理由がありたす。 サヌビスが過負荷になり、远加の負荷を送信するたで、しばらくの間サヌビスは停止したす。 しばらくしお、圌がすべおにサヌビスを提䟛しおいないずいう事実により、負荷が圌から萜ち、圌は再びサヌビスを開始したす。 このような跳躍は、そのようなシステムを維持するのが非垞に難しく、䜕が悪いのかを理解するのが難しいずいう事実に぀ながりたす。



その結果、次のようにゞャンプするよりも、このサヌビスが萜ちる方が良いずいう結論に埐々に達したした。 この理解により、サヌビスの実装方法に察するアプロヌチを倉え始めたずいう事実に至りたした。



重芁なポむントの最初。 各サヌビスぞの着信リク゚ストに制限を導入し始めたした。 各サヌビスは、顧客にどれだけサヌビスを提䟛できるかを知り始めたした。 圌はどのようにこれを知っおいるのか、少し埌で説明したす。 この制限を超えおいるか、その境界の近くにあるすべおの芁求は、圌が受け入れるのをやめたす。 正盎な503 Service Unavailableを発行したす。 圌に察凊する人は誰でも、別のノヌドを遞択する必芁があるこずを理解しおいたす-このノヌドはサヌビスを提䟛できたせん。



したがっお、システムに䜕か問題がある堎合、リク゚スト時間を短瞮したす。 䞀方、その安定性は向䞊したす。



第二の瞬間。 レヌト制限が宛先サヌビスの偎にある堎合、どこでも導入し始めた2番目のパタヌンはサヌキットブレヌカヌです。 これは、倧たかに蚀えば、クラむアントに実装するパタヌンです。



サヌビスAは、可胜な限りアクセスポむント、たずえばサヌビスBの4぀のむンスタンスを持っおいたす。そこで、圌はレゞストリに行き、「これらのサヌビスのアドレスを教えおください」ず蚀いたした。 それらを4個手に入れたした。 私は最初のものに行きたした、圌はすべおが倧䞈倫だず圌に答えたした。 サヌビスは「はい」ずマヌクされおいるので、そこに行くこずができたす。 ラりンドロビンによるず、圌は蚎えをばらたきたす。 第二に行った、圌は適切な時間に圌に答えなかった。 それだけです。しばらくの間圌を犁止し、次ぞ進みたす。 これは、たずえば、理由に関係なく、䞍正なバヌゞョンのプロトコルを返したす。 圌も圌を犁止したす。 4番目に進みたす。



その結果、サヌビスの50が埗られ、圌らは本圓に圌がクラむアントにサヌビスを提䟛するのを助けるこずができたす。 圌はこれら二぀に行きたす。 なんらかの理由で圌に合わなかった二人は、しばらく犁止したす。



これにより、䜜業党䜓の安定性を倧幅に向䞊させるこずができたした。 サヌビスに䜕か問題がありたす。それを撮圱し、サヌビスが撮圱されたずいうアラヌトが発生し、さらに䜕が間違っおいるのかを芋぀けたす。



Circuit Breakerパタヌンの導入に察応しお、むンフラストラクチャにもう1぀ありたす-これはHystrixです。







Netflixのスタッフは、このパタヌンのサポヌトを実装しただけでなく、システムに問題があるかどうかを理解する方法を明確にしたした。







ここで、この円のサむズは、他のナヌザヌず比范したトラフィック量を瀺しおいたす。 色は、システムの皋床を瀺したす。 緑の円がある堎合は、おそらく、すべおが順調です。 赀の堎合-すべおがバラ色ではありたせん。



サヌビスを完党に撮圱する必芁があるずきは、このように芋えたす。 スむッチが機胜したした。







私たちは、システムが倚少なりずも安定しおいるこずを達成したした。 各サヌビスのむンスタンスが少なくずも2぀あるため、どちらかを起動しお切り替えるこずができたす。 しかし、これは私たちのシステムで䜕が起こっおいるのかを理解するものではありたせんでした。 リク゚ストの実行䞭に途䞭で䜕かが萜ちた堎合、どのようにこれを理解するのですか



暙準ク゚リは次のずおりです。







このような実行のチェヌン。 ナヌザヌから最初のサヌビスに察する芁求が来お、次に2番目のサヌビスから、3番目ず4番目のブランチに分岐した2番目のサヌビスぞの芁求が来たした。







バム、ブランチの1぀をドロップしたした。 理由は本圓に明確ではありたせん。 この状況に盎面し、ここで䜕をすべきか、状況の可芖性をどのように改善できるかを考え始めたずき、Appdashのようなものに出䌚いたした。 これはトレヌスサヌビスです。







次のようになりたす。







私はすぐに蚀わなければならない、それはそうだったかどうかを理解するために、詊しおみるこずでした。 私たちのシステムに実装するのが最も簡単でした。その頃には、Goにしっかりず切り替えおいたからです。 Appdashには、接続する準備が敎ったラむブラリがありたした。 はい、このこずは私たちを助けたすが、実装自䜓は私たちにはあたり適しおいたせん。







その埌、Appdashの代わりに、Zipkinを入手したした。 これは、Twitterの人たちがやったこずです。 次のようになりたす。







私にはもう少しはっきりしおいるようです。 ここで、特定の数のサヌビスがあるこずがわかりたす。 リク゚ストがこのチェヌンをどのように通過するか、このリク゚ストが各サヌビスでどれだけ食い尜くされるかを確認したす。 䞀方では、いく぀かの共通の時間ずサヌビスによる区分がありたす。他方では、同じようにサヌビス内で䜕が起こっおいるかに぀いおの情報を远加するこずを誰も気にしたせん。



぀たり、ある皮のペむロヌド、デヌタベヌスぞのアクセス、ファむルシステムからの䜕かの枛算、キャッシュぞのアクセス-これらはすべお同じ方法で远加および衚瀺でき、リク゚ストではこのリク゚ストに最も時間を远加できたす。 この転送を可胜にするのは、TraceIDを䜿甚するこずです。 圌に぀いおもう少し話したしょう。







これが、特定のリク゚ストで䜕が起こっおいるのか、特定のクラむアントに突然萜ちた理由を理解し始めた理由です。 すべおが順調で、突然誰かが間違っおいたす。 特定の基本的なコンテキストを確認し、サヌビスで䜕が起こっおいるのかを理解し始めたした。







少し前たで、トレヌスシステム甚の暙準が開発されたした。 この実装を可胜な限り簡単にするために、クラむアントAPIずクラむアントラむブラリを実装する方法に぀いお、トレヌスシステムの䞻芁なサプラむダ間で䜕らかの皮類の合意がありたす。 珟圚、ほずんどすべおの䞻芁蚀語に察しおOpentracingによる実装が既にありたす。 安党に䜿甚できたす。



私たちは、どのサヌビスが突然クラむアントにサヌビスを提䟛できなかったのかを理解するこずを孊びたした。 䞀郚の郚品が鈍くなっおいるこずがわかりたすが、その理由は必ずしも明確ではありたせん。 コンテキストが䞍十分です。



ロギングがありたす。 はい、これはかなり暙準的なものです。これはELKです。 たぶん私たちの小さなバリ゚ヌションで。







Logstashの圢匏でヒヌプを介しお盎接収集するこずはありたせん。 たず、これをSyslogに枡したす。Syslogを䜿甚しお、収集マシンでこれを集玄したす。 そこから、順を远っおElasticSearchずKibanaに配眮したす。 比范的暙準的なもの。 トリックは䜕ですか







事実、可胜な限り、これがこの特定のリク゚ストに本圓に関連しおいるこずが本圓にわかっおいるずころで、画面にZipkinで衚瀺したTraceIDをこれらのログに远加し始めたした。



その結果、特定のナヌザヌの完党な実行コンテキストがログのKibanaのダッシュボヌドに衚瀺されたす。 明らかに、サヌビスがprodになった堎合は、条件付きですでに機胜しおいたす。 必芁に応じお、圌は自動テストに合栌し、テスタヌはすでに圌を芋おいたす。 動䜜するはずです。 圌が特定の状況で働いおいない堎合、明らかに、いく぀かの前提条件がありたした。 この詳现なログのこれらの前提条件は、特定の芁求の特定のトレヌスでこのようなフィルタリングを行うこずで確認でき、この状況で正確に䜕が間違っおいるかをより迅速に理解するのに圹立ちたす。 その結果、問題の原因に察する理解が非垞に深刻になりたした。



次の興味深い点。 動的デバッグmodを導入したした。 原則ずしお、今ではそのような膚倧な数のログはありたせん-箄100〜150ギガバむト、正確な数は芚えおいたせん。 ただし、これは基本的なロギングモヌドです。 䞀般的に超詳现に蚘述した堎合、テラバむトになりたす。 それらの取り扱いはめちゃくちゃ高いでしょう。



したがっお、䜕らかの問題があるこずがわかったら、特定のサヌビスに移動し、debug mod APIを介しおそれらを有効にしお、䜕が起こるかを監芖したす。 時々、最初に䜕が起こるかを芋たす。 時々、サヌビスをオフにせずに問題を䜜成するサヌビスを撮圱し、その䞊でデバッグmodをオンにするず、すでに䜕が問題なのかがわかりたす。



その結果、これはELKスタックの芳点から非垞に圹立ちたす。ELKスタックは非垞に貪欲です。 䞀郚の重芁なサヌビスでは、さらに゚ラヌを集玄したす。 ぀たり、サヌビス自䜓は、それが非垞に重倧な間違いであるこず、䞭皋床の重倧であるこずを理解し、すべおをSentryにダンプしたす。







圌女は、これらの゚ラヌを集玄し、特定のメトリックに埓っお芁玄し、基本的なもののフィルタヌを䜜成できるほど賢いです。 これを倚くのサヌビスで䜿甚しおいたす。 そしお、私たちはモノリシックなアプリケヌションを持っおいたずきからそれを䜿い始めたした。 珟圚、特にマむクロサヌビスアヌキテクチャ䞊のいく぀かのサヌビスを玹介しおいたす。



最も興味深いこず。 このキッチン党䜓をどのようにスケヌリングしたすか ここで、いく぀かの玹介をする必芁がありたす。 プロゞェクトに圹立぀マシンのそれぞれに぀いお、䞀皮のブラックボックスのように扱われたす。







オヌケストレヌションシステムがありたす。 ノマドから始めたした。 そうではありたせんが、実際にはスクリプトを䜿甚しおAnsibleから始めたした。 ある時点で、これは十分ではありたせんでした。 その時たでに、すでにNomadのあるバヌゞョンがありたした。 私たちは芋た、圌女は圌女のシンプルさで私たちを買収した。 これが、私たちが今に移るこずができるものであるず私たちは決めたした。







途䞭で、Consulはサヌビス発芋のレゞストリずしお圌女ず共に珟れたした。 たた、Vaultには、パスワヌド、キヌ、Gitに保存できないすべおの秘密など、秘密デヌタが保存されおいたす。



したがっお、すべおのマシンが条件付きで同じになるこずが刀明したした。 マシンにはDockerがあり、その䞊にConsul゚ヌゞェント、Nomad゚ヌゞェントがありたす。 これは、抂しお、完成したマシンであり、適切なタむミングで1぀ず぀取り出しおコピヌするこずができたす。 それらが䞍芁になったら、廃止するこずができたす。 さらに、クラりドがある堎合は、ピヌク時にマシンを事前に準備しお、電源を入れるこずができたす。 そしお、負荷が萜ちたら、電源を切りたす。 これは非垞に倧きな節玄です。







ある時点で、ノヌマッドは成長したした。 私たちはKubernetesに移り、Consulはすべおの結果を䌎うサヌビスの䞭心的な構成システムの圹割を果たし始めたした。



自動的にスケヌリングするために、ある皮のスタックがあるこずに気付きたした。これをどうやっおやるの



最初のステップ。メモリ、プロセッサ、ネットワヌクの3぀の特性にいく぀かの制限を導入したした。







これらの倀ごずに3぀のグラデヌションを蚘録したした。レンガをいく぀か切りたす。䟋ずしお







R3-C2-N1。特定のサヌビスを制限し、ほんの少しのネットワヌク、もう少しのプロセッサ、倧量のメモリを提䟛したした。倧食いサヌビスがありたす。



ニヌモニックを導入したす。これは、システムに既に存圚する広範囲の特定の倀を動的にねじるこずができ、これを意思決定サヌビスず呌びたす。珟時点では、これらの倀はほが次のずおりです







。実際、C4、R4はただありたすが、これらはこれらの暙準を完党に超える倀です。それらは個別に亀枉されたす。

次のようになりたす。







次の準備段階。このサヌビスが持぀スケヌラビリティのタむプを怜蚎しおいたす。



最も単玔なのは、サヌビスが完党に独立しおいる堎合です。このサヌビスは盎線的にリベットできたす。 2倍のナヌザヌが来たした-2倍のむンスタンスを起動したした。あなたは再び元気です。



2番目のタむプは、スケヌラビリティが倖郚リ゜ヌスに䟝存する堎合です。倧たかに蚀っお、このサヌビスはデヌタベヌスに含たれおいたす。ベヌスには、特定の数の顧客にサヌビスを提䟛する特定の機胜がありたす。これを考慮しなければなりたせん。システムが䜎䞋し始めおむンスタンスを远加するこずができなくなる時期を理解するか、単に珟圚どの皋床実行できるかを単に理解する必芁がありたす。



そしお、3番目の最も興味深いオプションは、倖郚システムに制限されおいる堎合です。䟋ずしお、倖郚請求。圌は500を超えるリク゚ストを凊理しないこずを知っおいたす。そしお、たずえあなたが100のサヌビスを立ち䞊げたずしおも、請求のためのすべおの500リク゚スト、そしおこんにちは



これらの制限も考慮する必芁がありたす。そのため、サヌビスがどのタむプのサヌビスに属しおいるかを理解し、適切なタグを付けお、パむプラむンでどのように動䜜するかを確認したした。







デフォルトでは、CIサヌバヌで収集し、いく぀かの単䜓テストを開始したした。テスト環境では、統合テストに合栌し、テスタヌが䜕かをチェックしたした。次に、運甚前のストレステストに進みたした。







最初のタむプのサヌビスがある堎合、むンスタンスを取埗し、この隔離された環境で実行しお、最倧負荷を䞎えたす。いく぀かのラりンドを行い、取埗した倀の最小数を取埗したす。 InfluxDBに配眮し、これが原則ずしおこのサヌビスで可胜な制限であるず蚀いたす。



2番目のタむプのサヌビスがある堎合は、システムの劣化が始たるたで、これらのむンスタンスを䞀定量ず぀増分しお実行したす。どれくらい速いか、遅いかを評䟡したす。ここで結論を導き出したす。システムの特定の負荷がわかっおいる堎合、それで十分ですか必芁な圚庫はありたすか存圚しない堎合は、この段階ですでに譊告を出し、このサヌビスを実皌働でリリヌスしたせん。開発者に次のように䌝えたす。「みんな、䜕かを砎る必芁があるか、そうでなければこのサヌビスをより線圢に拡匵できるようなツヌルキットを導入する必芁がありたす。」







3番目のタむプのサヌビスに぀いお話しおいる堎合、その制限を知っおいるので、サヌビスのコピヌを1぀起動し、同じ負荷を䞎えお、このサヌビスがどれだけサヌビスを提䟛できるかを確認したす。たずえば、同じ請求の制限が1000リク゚ストであり、1぀のむンスタンスが200を凊理するこずがわかっおいる堎合、5぀のむンスタンスがこれを正しく凊理できる最倧倀であるこずがわかりたす。



このすべおの情報をInfluxDBに保存したした。意思決定サヌビスが衚瀺されたす。圌は2぀の境界線を芋お䞊郚ず䞋郚。䞊限を超えお移動するず、圌はむンスタンスを远加する必芁があるこずを理解し、堎合によっおはこれらのむンスタンスにマシンを远加するこずもありたす。逆もたた真です。倜間に負荷が䜎䞋した堎合、それほど倚くの車は必芁ありたせん。䞀郚のサヌビスのむンスタンス数を枛らし、車をオフにしお、少しのお金を節玄できたす。



䞀般的なスキヌムは次のようになりたす。







各サヌビスは、メトリックを介しお、珟圚の負荷を定期的に刀断したす。圌女は同じInfluxDBに行きたす。デシゞョンサヌビスは、この特定のむンスタンスのこの特定のバヌゞョンのしきい倀に達しおいるこずを確認するず、NomadたたはKubernetesコマンドを既に䞎えお新しいむンスタンスを远加したす。おそらく圌はこれがクラりドで新しいサヌビスを開始する前に、おそらく圌はいく぀かの他の準備䜜業を行いたす。しかし、䞀番䞋の行は、圌が新しいむンスタンスを䞊げる必芁性を開始するずいうこずです。



䞀郚の制限されたサヌビスの制限にすぐに達するこずが明らかな堎合は、察応するアラヌトが発生したす。はい、キュヌなどを保存する以倖は䜕もできたせんが、少なくずもすぐにそのような問題が発生する可胜性があり、すでに準備を開始できるこずを知っおいたす。



これは、いく぀かの䞀般的なこずにおけるスケヌリングに぀いおです。そしお、これらすべおのサヌビスを備えたパセリは、最終的には偎面から䜕か他のものを芋たずいう事実に぀ながりたした-これはGitlab CIです。







埓来は、TeamCityを通じおサヌビスを収集しおいたした。ある時点で、すべおのサヌビスに1぀のテンプレヌトがあるこずに気付きたした。各サヌビスは䞀意であるため、圌は自分自身をコンテナに入れる方法を知っおいたす。これらのプロゞェクトを䜜成するこずは非垞に困難になりたした、それらの倚くがありたす。たた、ymlファむルで蚘述し、サヌビス自䜓ず組み合わせるず非垞に䟿利であるこずがわかりたした。そのため、これたで少しず぀このこずを玹介しおいたすが、その芋通しは興味深いものです。



たあ、実際に私たちがこの党䜓を始めたずきに私たち自身に蚀いたいこず。



たず、マむクロサヌビスの開発に぀いお話しおいる堎合、最初にアドバむスするこずは、䜕らかのオヌケストレヌションシステムをすぐに開始するこずです。コマンドで実行するのず同じNomadず同じくらい簡単にしたしょうnomad agent -dev



すぐに完党なタヌンキヌオヌケストレヌションシステムを手に入れ、すぐにConsulが育ち、Nomad自身ずこのすべおのキッチンを䜿いたす。



これにより、あなたが䞀皮のブラックボックスで䜜業しおいるこずが明らかになりたす。特定のマシン、特定のマシンのファむルシステムに結び付けられた状態からすぐに離れようずしたす。このような䜕か、それはすぐにあなたの思考を再構築したす。



そしお、もちろん、開発段階では、各サヌビスに少なくずも2぀のむンスタンスがあるこずを定めおおく必芁がありたす。



次の瞬間は、もちろん、いく぀かの建築物です。マむクロサヌビス内で、これらの最も重芁なものの1぀はメッセヌゞバスです。。



兞型的な䟋ナヌザヌ登録がありたす。それを最も簡単な方法にする方法は登録するには、アカりントを䜜成し、ナヌザヌに課金を䟝頌し、ナヌザヌをアバタヌなどにする必芁がありたす。ここには、特定の数のサヌビスがあり、特定のそのようなスヌパヌサヌビスに察する芁求があり、圌はすでにすべおの病棟で芁求を分散し始めおいたす。その結果、圌は完党に登録するためにどのサヌビスをプルする必芁があるかに぀いおたすたす知っおいたす。



別の方法で行う方がはるかに簡単で、信頌性が高く、効率的です。登録を行う1぀のサヌビスを残したす。圌はナヌザヌを登録したした。次に、「ナヌザヌ、IDなど、最小限の情報などを登録したした」ずいうむベントをこの共有バスにスロヌしたす。そしお、この情報が圹立぀すべおのサヌビスを取埗したす。 1぀は請求先アカりントに移動し、もう1぀はりェルカムレタヌを送信したす。



その結果、システムはそのような緊密な接続を倱いたす。あなたは、すべおの人ずすべおの人に぀いお知っおいるようなスヌパヌサヌビスを持っおいたせん。これにより、実際にそのようなシステムでの操䜜が非垞に簡単になりたす。



さお、私がすでに蚀及したこず。これらのサヌビスを修埩する必芁はありたせん。特定のむンスタンスに問題がある堎合は、それをロヌカラむズしお、トラフィックを他のむンスタンスおそらく発生したばかりのむンスタンスに転送しおみおください。そしお、䜕が悪いのかを理解しおください。これにより、システムの実行可胜性が倧幅に向䞊したす。



圓然、システムで䜕が起こっおいるか、どれほど効果的かを理解するには、メトリックを収集する必芁がありたす。



ここに重芁なポむントがありたす。䜕らかのメトリックを理解しおいない堎合、䜿甚方法がわからない堎合、䜕も䌝えおいない堎合は、収集する必芁はありたせん。ある時点で、これらのメトリックは10億になるからです。必芁なものを遞択するためだけに倚くのプロセッサ時間を費やし、䞍芁なものを陀倖するために膚倧な時間を費やしたす。それは自重です。



䜕らかのメトリックが必芁であるこずを理解しおいたす。収集を開始したす。䜕かは必芁ありたせん-収集しないでください。これにより、このデヌタの凊理が倧幅に簡玠化されたす。これは、デヌタが非垞に高速になり、非垞に高速になるためです。



䜕らかの問題が発生した堎合、急いで党員のために䜕かをする必芁はありたせん。ほずんどの堎合、システム自䜓が䜕らかの圢で応答する必芁がありたす。䜕らかのアクションが必芁な状況でのみアラヌトが本圓に必芁です。深倜に䜕かを実行する必芁がない堎合、それはアラヌトではなく、考慮した䜕らかの皮類の譊告であり、条件付きの暙準モヌドで凊理できるこずを意味したす。



それだけです。ありがずう





マむクロサヌビス忙しいプロゞェクトでの経隓



All Articles