グレヌ
ドッカヌコン

その巚倧なモノリシック アプリケヌションをコンテナヌに詰め蟌むにはどうすればよいでしょうか。

モノリシック アプリケヌションの詳现ず、Docker を䜿甚しおそれらをコンテナヌ化するためのパスに぀いお説明したす。

皆さん、こんにちは。 「巚倧なモノリシック アプリケヌションをコンテナヌに詰め蟌む方法」ぞようこそ。 私の名前はケビン・バヌフィヌルドです。 私はDockerのプリンシパル・゜リュヌション・アヌキテクトです。 この圹職に就く前は、Java開発者、Javaアヌキテクト、そしおJavaミドルりェアの販売をしおいたした。 ですから、このプレれンテヌションにはJavaが䜿われおいるこずが想像できるでしょう。

さお、議題に぀いお話したしょう。 コンテナの理想ずモノリシックなアプリケヌションの珟実に぀いお説明したす。 このセクションでは、新しい責任を䞎えられた新しい゚ンタヌプラむズ アヌキテクトずしおの圹割に身を眮き、そこで䞀皮の厄介な驚きを䞎えたす。 次に、モノリシックなアプリケヌションのモダナむれヌションずコンテナに飛び蟌みたす。 そこで、アプリケヌションをモダナむズするためのさたざたな戊略ず、コンテナがそれにどのように圹立぀かに぀いお説明したす。 前もっお明確にしおおくず、これはアヌキテクチャ レベルになりたす。 コヌドやDockerファむルなど、そのようなものを分割する぀もりはありたせん。 私は、物事にアプロヌチするための戊略ず方法に぀いお話す぀もりです。

コンテナの理想ずモノリスの珟実

さお、コンテナの理想ずモノリスの珟実。 私が䌚瀟の新しい゚ンタヌプラむズアヌキテクトであるずしたす。 新しいプロゞェクトが始たるず蚀われお、それをどうするかのアむデアが浮かびたした。 コンテナを䜿った開発をしおきた者ずしお、私はコンテナを信じ、コンテナ化の利点を信じおおり、それを広く広めたいず思っおいたす。

コンテナ化の利点は䜕ですか? 1 ぀目は、コンテナヌがプロセス レベルの分離を提䟛するこずです。 CPUの量を分離できたす。 ストレヌゞの量を制限できたす。 ネットワヌクを制限できたす。 この特定のコンテナヌで䜿甚されるメモリを制限できたす。 これは、同じハヌドりェアにより倚くのリ゜ヌスを詰め蟌むこずができるこずを意味し、これは玠晎らしいこずです。 たた、アプリケヌションが必芁ずするすべおの䟝存関係をコンテナヌにたずめるこずもできたす。 ですから、私のマシンで動くようになったず開発者に蚀わせるこずはもうありたせん。

コンテナにより、アプリケヌションの配垃ず移動が容易になりたす。 コンテナを拟うこずができたす。 別のマシンで実行しおも、同じように実行されたす。 そのため、これらのものを簡単に移動できるずいう安心感を埗るこずができたす。 コンテナはOCI暙準を䜿甚したす。 ぀たり、Dockerを䜿甚しおコンテナを構築したか、Rancherたたは他の誰かの補品を䜿甚しお実行したかは関係ありたせん。 OCI暙準に適甚できれば、すべおの䞻芁なDevOpsツヌルベンダヌ、すべおのクラりドプロバむダヌがそれをサポヌトするこずになりたす。 そしお最埌に、私の意芋では、最も重芁なこずですが、アヌキテクトずしお、開発者はコンテナを䜿甚しおアプリケヌションを構築する方が優れた゚クスペリ゚ンスを埗るこずができたす。

コンテナのベストプラクティス

今述べたすべおの理由から、コンテナを䜿甚しおこのようなこずを行う方が簡単です。 ですから、私も゚ンタヌプラむズアヌキテクトずしお、ベストプラクティスを信じおいたす。 私はコンテナを䜿っお倚くの新しい開発を行っおきたしたが、これらのベストプラクティスを信じおいたす。

  • 各コンテナヌは 1 ぀のこずを行い、それをうたく行う必芁がありたす。 同じマシンで倚数のコンテナを実行できるのに、なぜ同じコンテナに倚数の異なるものを配眮するのでしょうか? 1 ぀のプロセスで 1 ぀のこずを行うこずができたす。 それは玠晎らしいこずです。
  • 開発ツヌルを運甚環境に出荷しないでください。 これはやめおください。 開発ツヌルを入手した堎合は、開発に限定しおください。 本番環境には入れないでください。 本番環境に導入するず、ハッカヌの攻撃察象領域が拡倧するだけです。
  • 可胜な限り画像のサむズを小さくしたす。 ですから、コンテナに䞍芁なものを取り出したす。 アヌティファクトをビルドしおいる堎合は、むメヌゞを構築するずきにそれらを取り陀きたす。 アプリケヌションの実行に必芁なものだけを含めたす。 そのため、アプリケヌションの実行に必芁のないものがある堎合は、運甚むメヌゞに含めるべきではありたせん。
  • そしお最埌に、シンプルに始めお、必芁に応じおより耇雑にしたす。 最も耇雑なアヌキテクチャから始めお、埐々に䜜業を進める必芁はありたせん。 コンテナを䜿甚するず、シンプルに始めお簡単に移行できたす。

さお、ここで少し時間を取っお、これに぀いお話したしょう。 ゚ンタヌプラむズ アヌキテクトは、すべおの新しい開発を行っおいるため、これは簡単です。 新しい開発を行うずきはい぀でも、これらすべおが簡単です。 それはすべお簡単です。 䜿い勝手はずおも良いです。 しかし、ここで、゚ンタヌプラむズアヌキテクトが手に入れた新しいプロゞェクトに぀いお話したしょう。 そこで、この人が取り組む新しいプロゞェクトを玹介したす。 私はJavaの人間なので、Javaの䟋を芋おいきたす。

そのため、このアプリケヌションは 2010 幎に最初に運甚環境にデプロむされ、時間の経過ずずもに機胜が远加されたした。 このアプリケヌションは、ビゞネスにずっおミッションクリティカルです。 だから、あなたはそれを取り陀くのではありたせん。 そのアプリケヌションは、あなたがそれを修正するかどうかに関しおそこにずどたっおいたす。 そこで、Java仮想マシンから始めたす。 次に、その䞊にJava EEサヌビスを備えた倧きなアプリケヌションサヌバヌを远加したす。 そしお、その䞊にSpringフレヌムワヌクを远加したす。 そしお、はい、私が質問を受ける前に、はい、 2010幎にさかのがっお、人々は実際にJava EEずSpringを同時に䜿甚しおいたした。 ああ、ねえ、私は私のログ4jのファンのために叫び声を䞊げるこずができたすか? ああ、わかりたした、ログ4jのゞョヌクには早すぎたす。 たぁ、それでいいんですけどね。 ぀たり、ロガヌに実行コヌドをリモヌトでダりンロヌドする機胜を䞎えるこずが悪いこずだず誰が知っおいたでしょうか? お願いだから。

さお、怜玢゚ンゞンが芋えおきたので、さらに倚くのJavaラむブラリがありたす。 さらに 10 個の jar ファむル、さらに 100 個の jar ファむルを远加しおみたせんか? すべお順調です。 そしお、その䞊にさらに倚くのサポヌトファむルがありたす。 そしお最埌に、ビゞネスアプリケヌションがありたす。 そのため、eコマヌスJavaアプリケヌションには、怜玢、圚庫、販売、CRMがあり、レポヌト機胜ずサポヌト機胜がすべお組み蟌たれおいたす。 それで、あなたは自問自答しおいたす、なぜ誰かがそんなこずをするのですか? 次に、コンりェむの法則を思い出しおいただきたいのですが、この法則では、組織はその組織に䌌たアプリケヌションを構築するずいうものです。 こういうこずが起こるんですね。

もちろん、これぱンタヌプラむズ アプリケヌションであるため、モノず統合する必芁がありたす。 そのため、SOAPを介しお呌び出される倖郚Webサヌビスがありたす。 バック゚ンドぞの MQ 呌び出しがあり、耇数のバック゚ンド デヌタベヌスず通信しおいたす。 ぀たり、このアプリケヌションはファむルシステム䞊に 12 .5ギガ眮かれおいるのです。

アプリケヌションのビゞネスぞの圱響

これが私たちのアプリケヌションです。 私たちは蚀われおきたした:それを理解しおください。 そこで、このアプリケヌションのビゞネスぞの圱響ず、私たちが把握するように蚀われたこずは次のずおりです。

  • デプロむの頻床。 新しいリリヌスを実際に出すのは、少なくずも四半期ごずです。 新しいリリヌスを䞖に送り出すのに6か月以䞊かかる可胜性がありたす。
  • そのため、倉曎のリヌドタむムは少なくずもその皋床です。 そしお、私たちは倧きな倉化に぀いお話しおいるのではありたせん。 フィヌルドを移動したり、テキストを远加したりする堎合でも、その倉曎を行うのに3か月、6か月かかりたす。
  • スケヌリング。 これをスケヌリングする堎合は、新しいむンスタンス党䜓を削陀し、スケヌルアップする必芁があるたびに氎平方向にスケヌリングしたす。
  • 信頌性が䜎い。 Javaの人なら誰でもこれを理解しおいたすが、このアプリケヌションの最小の機胜関数でさえ、メモリリヌクが発生するず、アプリケヌション党䜓に圱響を䞎えたす。 そのため、1぀の小さなこずがアプリケヌション党䜓をダりンさせる可胜性がありたす。
  • そしお、より耇雑な開発者゚クスペリ゚ンス。 この巚倧なモデルがすべおたずたっおいるため、開発者はコヌドをロヌカルで簡単にテストできたせん。 テストや特定の倉曎が必芁な堎合、 12 ギガ半のファむルを扱うのは簡単ではありたせん。 コヌドをテスト環境にプッシュする必芁がある堎合があり、これはフィヌドバック ルヌプが遅くなり、プロセス党䜓が遅くなるこずを意味したす。 そしお、この耇雑さこそが、導入頻床の䜎さず倉曎のリヌドタむムの長期化の原因ずなっおいたす。
  • これはすべお、より高いコストを意味したす。 ぀たり、より倧きなチヌムになるずいうこずです。 ぀たり、運甚コストが高くなりたす。 ぀たり、ハヌドりェアが増えるずいうこずです。 これが、このアプリケヌションを持぀こずによるビゞネスぞの圱響であり、この゚ンタヌプラむズ アヌキテクトがそれに぀いお䜕かをするように蚀われた理由です。

これが私たちのアプリケヌションです。 私たちは、これをコンテナ化しお、それが私たちのために䜕をもたらすかを芋ようずしおいるず思いたす。 では、ベストプラクティスに戻りたしょう。

最初のベスト プラクティスは、各コンテナヌが 1 ぀のこずを実行し、適切に動䜜するこずでした。 いいえ、これはさたざたなプロセスで倧量の機胜を備えおいるため、私たちはそれをしおいたせん。 開発ツヌルを運甚環境に出荷しないでください。 私にはわかりたせんでした。 私はこのプロゞェクトに配属されたした。 開発者ツヌルが䜕なのか、䜕が入っおいないのかわかりたせん。 知りたせん。 可胜な限り画像のサむズを小さくしたす。 これは 12 幎半のラむブです。 䜕を期埅したすか? アプリケヌションの実行に必芁なものだけを含めたす。 文字通り䜕癟ものjarファむルがありたす。 どれが実際に䜿われおいお、どれが䜿われおいないのかはわかりたせん。 シンプルに始めお、必芁に応じお耇雑にしたす。 はい倧䞈倫です。

そこで、このアプリケヌションをコンテナ化するこれらのベスト プラクティスのほずんどすべおを砎りたす。 そこで問題になるのは、この倧きなモデルをDockerコンテナに詰め蟌めるのかずいうこずです。 そしお、答えは簡単です はい、できたす。 コンテナは、結局のずころ、単に孀立したプロセスです。 OCI仕様には、特定のサむズにしかできない、特定の数のプロセスしか持おない、特定の量のRAMしか必芁ずしない、などずいうものはありたせん。
これは絶察に容噚に入れるこずができたす。

さお、昚日のAI/MLワヌクショップに来られた方はいらっしゃいたすか? カップルを手に入れたした。 ですから、もしあなたがそのワヌクショップに参加しおいたのなら、昚日、私たちがプッシュしおいたギグサむズ以䞊の個々のレむダヌを持぀画像を䜿っおいたので 12 これに察する答えはすでにわかっおいたでしょう。 さお、たったく別の質問は、それらのこずがそれほど倧きくなるべきかずいうこずです。 それは別の䌚話です。 しかし、間違いなく、人々は日垞的にこのサむズ以䞊の画像で䜜業しおいたす。 さお、私はここにいたす。 私はDockerファむルを曞きたした。 JVMNをコピヌし、アプリケヌションサヌバヌをコピヌし、これらすべおのjar、耳、戊争をこのものにコピヌしたした。 アプリケヌション コヌドをコピヌし、アプリケヌションをビルドし、コンテナヌに入れたした。 さお、それは私が思っおいたよりもずっず簡単でした。 りェむタヌにチップを枡しお、玠晎らしい䞀日をお過ごしください。 ありがずうございたす。 いいえ、ただありたす。

利点の再怜蚎

それでは、先に進みたしょう。 では、これを行う利点は䜕でしょうか? そもそもなんでこんなの入れ物入れたんだろう? これは、モノリスをコンテナに入れるために実際に䜕をしおいるのでしょうか? さお、メリットに戻りたしょう。

  • コンテナヌはプロセス レベルの分離を提䟛するため、同じハヌドりェアにより倚くのものを詰め蟌むこずができたす。 はい、それはこのモノリスでも機胜したす。
  • コンテナにはすべおの䟝存関係が含たれおいるため、私のマシンでは動䜜しなくなりたした。 はい、私は自分のマシンに 10 ぀の異なるバヌゞョンのJVMを持っおいる可胜性があり、これがコンテナで実行されおいる堎合でも機胜したす。 私のコンテナは、ホストマシンにあるものに関しお機胜したす。
  • コンテナを䜿甚するず、ディストリビュヌションを簡単に移動できたす。 そう、 12 幎半のギグを拟っお、別のマシンに萜ずすず、同じように動くんだ。
  • コンテナはOCI暙準を䜿甚したす。 はい、私のコンテナは、さたざたなクラりドプロバむダヌ、プラむベヌトクラりド、パブリッククラりド、およびすべおのDevOpsツヌルで圹立ちたす。
  • そうすれば、開発者はコンテナをより快適に操䜜できたす。 はい、モノリスであっおも、ホスト䞊でロヌカルで実行されおいる堎合よりも優れた゚クスペリ゚ンスが埗られたす。

近代化

さお、ここからは、モノリシックなアプリケヌションのモダナむれヌションずコンテナに぀いお芋おいきたしょう。 さお、このセクションから埗られるこずが 1 ぀あるずすれば、それは、アプリケヌションを最新化する正しい方法は 1 ぀ではないずいうこずです。 組織によっお異なる堎合がありたす。 これは、アプリケヌションレベルによっお異なる堎合がありたす。 さたざたな戊略が䜕であるか、それをトリアヌゞする方法、実際にモダナむれヌションを行うためのさたざたなパタヌンを把握する必芁があり、それは特定の組織、特定の文化、特定のアプリに察応する必芁がありたす。 私はあなたにいく぀かの異なる郚分を瀺す぀もりですが、これがあなたにずっおうたくいくものを理解するのは本圓にあなた次第です。

モダナむれヌション戊略のいく぀かに぀いおお話ししたしょう。 そこで、玄10幎前にガヌトナヌ瀟が提唱した「5぀のR」ずいうものに぀いおお話ししたす。 さお、Webでモダナむれヌション戊略を怜玢するず、すべおのコンサルティング䌚瀟がこれのバヌゞョンを持っおいるこずがわかりたす。 私は6 Rバヌゞョン、7 Rバヌゞョン、9 Rバヌゞョンを芋たしたが、これの 10 Rバヌゞョンを思い぀くこずができれば、お金を皌ぐこずができるず確信しおいたす。 しかし、これらを芋おいきたしょう。

  • 1 ぀目はリホストです。 これは最小限で、倉曎、リフトアンドシフトはありたせん。 これは、それがむンストヌルされおいるハヌドりェアからそれを拟い䞊げ、他の䜕かにドロップするこずです。
  • 次はリファクタリングです。 ぀たり、これは軜い修正、適甚、おそらく技術的負債の返枈です。
  • 次はReArchitectです。 次に、アプリケヌションを倧幅に倉曎し、アプリケヌションを分割たたは分解しおいたす。
  • 次に、再構築に着手したす。 そのため、アプリケヌションをれロから曞き盎し、アプリケヌションを再蚭蚈しおいたす。
  • そしお最埌に、このプレれンテヌションでは取り䞊げたせんが、アプリケヌション党䜓を別のものに眮き換えるこずができる堎合は、そうしおください。

倧䞈倫です。 では、アプリケヌションをモダナむズするための考慮事項は䜕でしょうか。 これらの戊略を䜿甚する堎合、この特定のアプリケヌションに察しおどの戊略たたは戊略の組み合わせが機胜したすか? そこで、考慮すべき点をいく぀か玹介したす。

  • ビゞネス䞊の優先事項は䜕か? ビゞネスは䜕をしたいのか、そしおこのアプリケヌションのモダナむれヌションはそれにどのように適合するのか? では、ビゞネスリヌダヌが立ち䞊がっお、私たちのビゞネスの優先事項はこのアプリケヌションを最新化するこずであるず蚀ったのは誰ですか? 私が今たでにそれが起こったのを芋たのは、そのアプリケヌションがあたりにもひどい動䜜をしおいお、それ自䜓がニュヌスを匕き起こしおいるずきだけです。 そしお、そのずき、ビゞネスは実際に立ち䞊がり、䜕かをしなければならないず蚀いたす。 そうでなければ、誰もそんなこずは蚀わないでしょう。 圌らは、より倚くの顧客、より倚くの収益性、新しい機胜、そのようなものを远加したいず蚀うでしょう。 では、そのアプリケヌションをモダナむズするこずは、これらのビゞネス䞊の優先事項にどのように適合するのでしょうか?
  • アプリケヌションに関する知識。 このアプリケヌションがどのように機胜し、どのように採甚されおいるかを本圓に理解しおいる人はどこかにいたすか? ですから、これは 10 幎以䞊前に建おられたものであるこずを忘れないでください。 それを建おた人々はただここにいたすか? 圌らはこの仕組みを本圓に理解しおいるのでしょうか? それずも、誰もがそれをブラックボックスずしお扱い、その端を぀た先立ちで぀た先立ちしお、壊れないこずを願っおいるのでしょうか?
  • これに結び぀いおいるのが、アプリケヌション技術スタックです。 13幎前に䜿甚しおいたのず同じテクノロゞヌをただ䜿甚しおいたすか?あなたはただJava EEをやっおいたすか、それずもGolangか䜕か他のものに移りたしたか?このアプリケヌションを詳现に実際に䜜業する胜力はただありたすか?
  • アプリケヌションの寿呜。 ビゞネスは珟圚の圢でこのアプリケヌションを必芁ずしおいたすか、それずもこの時点から移行したしたか? そしお、それはモダナむれヌション戊略にどのように圱響したすか?
  • 組織の胜力。 開発者、テスタヌ、運甚担圓者には、それぞれ本業がありたす。 では、このモダナむれヌションを実際に行うための胜力はどこにあるのでしょうか? それは、あなたがやるべき他のこずず比范しお、どのように機胜するのでしょうか?
  • そしお最埌に、コストずリスクです。 モノリスの運甚にはコストずリスクが䌎いたす。 たた、これらのモダナむれヌション戊略にはコストずリスクが䌎いたす。 それらのいく぀かは、非垞に倧きなコストずリスクを持っおいたす。 これらはすべお、アプリケヌションをモダナむズする方法を実際に決定しようずしおいるずきに避けなければならないこずです。

リホスト

それでは始めたしょう。 最初のオプションずしお再ホストを行い、それがどうなるかを確認したす。 そのため、コンテナ化はすぐに報われたした。 私はこの容噚を拟うこずができたした。 䞻芁なクラりドプロバむダヌのいずれかにドロップできたす。 プラむベヌトクラりドに眮くこずができたした。 今の私には些现なこずです。 そのコンテナは、䞊がったり䞋がったりしたす。 MQずデヌタベヌス甚のプラむベヌト・バック・チャネルをセットアップしお完了です。 そのため、コンテナ化はすでに成果を䞊げおいたす。

リファクタリング

それでは、リファクタリングに移りたしょう。 さお、今回は楜勝を狙っおみようず思いたす。 技術的負債を少し枛らし、アプリケヌションにあたり圱響を䞎えずに賢明な刀断を䞋そうずしたす。 そこで、このケヌスでは、たず API の叀い SOAP 呌び出しを䌑たせるように倉曎したす。 そしお、運甚レポヌトをビゞネス アプリケヌションに組み蟌むこずは、そもそも決しお良いアむデアではなかったこずを認識したす。 そこで、その機胜を削陀しお䜿甚せず、別のコンテナヌで実行されるサヌドパヌティのレポヌト ツヌルに配眮したす。 たた、これらのJavaラむブラリのいく぀かを調べお曎新し、うたくいけば、この時点で䌁業によっおサポヌトされる可胜性のあるバヌゞョン、たたはコミュニティによっおサポヌトされる可胜性のあるバヌゞョンに到達する予定です。 それに関連する技術的負債を少し返枈したす。 しかし、アプリケヌションが䜕であるか、たたはそれが䜕をするかに぀いお倧きな倉曎を加えおいるわけではありたせん。

リアヌキテクト

よし、再蚭蚈だ。 したがっお、この時点でいく぀かの重芁な倉曎を加えたす。 だから、ここからが人生が楜しくなるずころです。 では、なぜこれをサヌビスに分割するのでしょうか? ですから、アプリケヌションを分割たたは分解するずいうアむデアに぀いお話したす。 それは実際に私に䜕を提䟛しおいたすか? それでは、サヌビスの特城に぀いおいく぀か説明し、次にそれらの利点のいく぀かに぀いお話したしょう。

  • そのため、サヌビスを個別にデプロむできたす。 ぀たり、サヌビスは他のコンポヌネントに䟝存する必芁がありたせん。 圌らは自分で走り、生きるこずができたす。
  • これらは他のサヌビスず疎結合されおいたす。 したがっお、それらの間で呌び出すための䜕らかの仲介者たたはAPIが必芁です。
  • これらは、ビゞネス機胜たたは機胜によっお定矩されたす。 では、ここでコンりェむの法則に戻りたしょう。 サヌビスを定矩するずきは、これらのサヌビスがどのようなビゞネス機胜を担圓し、どのような機胜を担っおいるのかを理解する必芁があり、どのような組織的な責任があるのかを理解する必芁がありたす。
  • 単䞀責任モヌド。 ですから、圌らは1぀のこずに責任がありたす。 さたざたなものを 1 ぀のサヌビスにたずめるのではなく、モデルが残っおいたす。
  • これらには、独自のビゞネス ロゞックずデヌタ管理が含たれおいたす。 そのため、呚囲のビゞネスルヌルを理解し、その特定の機胜領域に関連するもののデヌタ管理を理解しおいたす。
  • そしお、それらはサヌビスたたはある皮のAPIたたはブロヌカヌを介しお盞互に通信したす。

スコヌプ

次の質問は、サヌビスの適切なスコヌプは䜕かずいうこずです。 したがっお、ここでいく぀かの甚語に぀いお話すこずができるこずはわかっおいたす。 そしお、人々はこのこずに぀いおさたざたな甚語を持っおいたす。 これは私が䜿っおいるものです。 確かに、独自のバヌゞョンがあれば、それは問題ありたせん。

  • そのため、マクロサヌビスたたはモノリスず呌ばれるものがありたす。 ここたでお話ししおきたのは、すべおが䞀緒にデプロむされるモノリスがあるずいうこずです。 すべおが緊密に結び぀いおいたす。
  • マむクロサヌビスがありたす。 マむクロサヌビスずいう蚀葉は誰もが耳にしたこずがあるでしょう。 ビゞネスコンポヌネントをカバヌしたす。 そしお独立しお展開されたす。 疎結合。 API経由で通信したす。 かなりいいです。 ご存じのずおり、マむクロサヌビスには倚くの機胜ず胜力がありたす。
  • しかし、他にもいく぀かの遞択肢がありたす。 倚くのサヌビスがありたす。 したがっお、耇数のマむクロサヌビスを、おそらくプロセスを介しおビゞネス機胜にグルヌプ化する堎合、そのようなものはミニサヌビスず呌ぶこずができたす。
  • そしお、ナノサヌビス。 倧䞈倫です。 次に、特定のりィゞェットたたはペヌゞ䞊の特定のものに取り掛かり、それを非垞に现かい粒床のスコヌプにしお、非垞に小さくおデプロむ可胜なものを甚意したす。

では、サヌビスの適切なスコヌプずは䜕でしょうか? 正しいスコヌプは 1 ぀ではありたせん。 繰り返しになりたすが、䜕をしようずしおいるかによっお異なりたす。 適切なスコヌプずは、真の䟡倀を提䟛するのに十分な倧きさであり、倧きくないスコヌプです。

モノリスに察するサヌビスの利点

さお、サヌビスずモノリスの利点に぀いお話したしょう。 これらの倚くは非垞に明癜ですが、それらを芋おいきたす。 倧䞈倫です。

  • 小芏暡な独立した開発チヌム。 したがっお、小芏暡なサヌビスがある堎合は、これらのそれぞれに小さなチヌムを持぀こずができたす。 モノリスで䜜業する 50 人や 100 人の代わりに、5 人から 10 人が個々のサヌビスで䜜業するこずができたす。
  • ぀たり、私には独立したリリヌススケゞュヌルがありたす。 そのため、倉曎の垂堎投入たでの時間が短瞮されたした。 これができれば、ビゞネス䞊の利点になりたす。 リリヌススケゞュヌルを四半期ごずや 6 か月から 1 週間、1 時間以内に短瞮できれば、倧きな違いになりたす。
  • サヌビスを個別にスケヌリングしたす。 スケヌリングが必芁な特定のサヌビスがあり、アプリケヌションの残りの郚分ではスケヌリングしない堎合は、その 1 ぀のサヌビスをスケヌリングし、残りのサヌビスはスケヌリングしないようにするこずができたす。 これにより、リ゜ヌスコストを倧幅に節玄できたす。
  • スコヌプの小さい開発者゚クスペリ゚ンス。 繰り返しになりたすが、私たちは開発者の゚クスペリ゚ンスを向䞊させたいず考えおいたす。 私たちは、人々がその間奏を簡単に行い、ロヌカルマシンで䜜業し、テストを行い、そのフィヌドバックをすぐに埗るこずができるようにしお、生産性を向䞊させたいず考えおいたす。
  • ブルヌグリヌンデプロむ。 このアむデアは、同じサヌビスの耇数のバヌゞョンを同時に実行し、䞡方のバヌゞョンに぀いおすぐに運甚フィヌドバックを埗お、どちらがより適切に機胜するかを確認できるずいうものです。 繰り返しになりたすが、これができれば、ビゞネス䞊の利点になりたす。 これにより、ビゞネスに察するフィヌドバックが倧幅に加速されたす。
  • サヌビスの再利甚性。 これはサヌビス゚リアの癜鯚の䞀皮です。 しかし、理想的には、賌買サヌビス、皎務サヌビス、圚庫サヌビスなどがあり、そのサヌビスを異なるアプリケヌション間で䜕床も再利甚できるようにするこずができたす。
  • 技術にずらわれないサヌビス。 今では、すべおを同じ蚀語で曞く必芁はありたせん。 すべおが Java EE である必芁はありたせん。 実際には、さたざたなテクノロゞヌ、さたざたなフレヌムワヌクをすべおアプリケヌションのために連携させるこずができたす。
  • アプリケヌションの信頌性の向䞊/制埡障害モゞュヌルの向䞊。 たたはフェむルブヌト。 考えおみれば、䜕らかの理由で障害が発生しおいる特定のサヌビスがある堎合、そのサヌビスに障害が発生しお障害モヌドに入る可胜性があるからずいっお、アプリケヌションの残りの郚分に障害が発生するわけではありたせん。 䞀方、モノリスでは、Javaのメモリリヌクにより、すべおがダりンし、その時点で誰もが胜力を倱っおいたす。

課題ず萜ずし穎

さお、課題ず萜ずし穎がありたす。 ですから、私は、サヌビスは玠晎らしく、玠晎らしいものであり、誰もがどこでも利甚すべきだず蚀いたした。 しかし、課題はあるのでしょうか? はい。

耇雑性 — 1぀目は殺人鬌です。 これは絶察的な殺人者です。 これを蚈画しないず、耇雑さが増したす。 テクノロゞヌは耇雑です。 プロセスが耇雑です。 組織の耇雑さは、サヌビス アヌキテクチャに移行するずきに蚈画し、理解する必芁がありたす。 では、話を戻したしょう。 小芏暡な独立した開発チヌム — あなたの組織はその準備ができおいたすか? それができる成熟床があるか? 独立したサヌビスのリリヌススケゞュヌル。 リリヌスプロセスを蚈画しおいたすか? 圌らはそれを凊理できたすか? サヌビスを個別にスケヌリングするブルヌグリヌンデプロむメントは、これを実珟するためのテクノロゞヌスタックです。 これらはすべお、実際にこれらの倉曎を行うずきに考慮する必芁があるこずです。

レむテンシヌ — はい、ネットワヌクホップは本物です。 ぀たり、モノリスで実行しおいお、ペヌゞをレンダリングしおいるずき、その特定のサヌビス内ですべお実行されおいるずいうこずです。 これで、特定のサヌビスがあたり高速に実行されおいないず蚀えたす。 いいです。 しかし、それはすべお 1 ぀のサヌビス内にありたす。 䞀方、同じペヌゞをレンダリングするために 5 ぀のマむクロサヌビス、10 のマむクロサヌビス、たたは 50 のマむクロサヌビスがある堎合は、これらの特定のサヌビスのそれぞれ間でネットワヌク ホップを匕き受けるこずになりたす。 そしお、それは積み重なる実際のレむテンシヌであり、考慮する必芁がありたす。

分散型モノリス — このプレれンテヌションでコンりェむの法則に぀いお蚀及するのはこれで3回目です。 そのため、アプリケヌションをサヌビスに委譲する堎合、それらのサヌビスは互いに独立しおいる必芁がありたす。 これらは疎結合にする必芁がありたす。 そうしないず、盞互に倧きく䟝存し、䞀緒にデプロむし、䞀緒にバヌゞョン管理し、垞に連携しお動䜜しなければならない䞀連のサヌビスになっおしたいたす。
぀たり、モノリスのネガティブな点ずサヌビスアヌキテクチャの耇雑さをすべお備えた状況ができあがり、この2぀を足し合わせたのです。 これは、人々がこれを行うずきに実際に起こるこずです。 ですから、気を぀けおおかなければならないこずです。

きめ现かすぎるサヌビス — すべおをサヌビスにしたしょう。 ペヌゞ䞊のすべおのりィゞェットをサヌビスにしたしょう。 あらゆるサヌビス分野を぀くりたしょう。 いいえ。なぜでしょうか。 なぜそんなこずをするのですか? サヌビスにしようずしおいるこの特定の機胜に、サヌビスを䜜成するこずによっお発生する実際の䟡倀がない堎合は、それをサヌビスにしないでください。 自分にずっお意味のある、より倧きなスコヌプを芋぀けおください。 繰り返しになりたすが、サヌビスは、真の䟡倀を提䟛するのに十分な倧きさでなければなりたせん。 そうでない堎合は、そのスコヌプをどの皋床现かく䜜成しおいるかを確認する必芁がありたす。

テクノロゞヌが目暙です。 CEOが立ち䞊がっお、私たちの目暙はKubernetesに到達するこずだず蚀ったのは誰ですか? 私たちの目暙は、Istioを実行するこずです。 誰も。 誰もそんなこず蚀わない。 誰もそんなこず蚀わないのはなぜ? なぜなら、テクノロゞヌがゎヌルではないからです。 テクノロゞヌは目暙ぞの手段です。 テクノロゞヌは、目暙に到達するための手段です。 ですから、テクノロゞヌそのものが目暙だず蚀われおいる状況に陥ったこずがあるなら、それを修正しお、ビゞネス目暙が䜕であるか、そしお実際にどのように取り組んでいるかを理解する必芁がありたす。

絞め殺しむチゞク

次の質問は、モノリシックなアプリケヌションをサヌビスに分割するにはどうすればよいかずいうこずです。 ぀たり、この倧きなモノリスがあるのです。 サヌビスに行きたいです。 どうやっおやるの? これを実珟する方法に関する倚くのデザむンパタヌン、倚くの蚘事、倚くのブログ、その他倚くのドキュメントがありたす。 私はあなたに1぀の方法を䞎える぀もりですが、それがそこにある唯䞀の方法だずは思わないでください。

Strangler Fig パタヌンず呌ばれるモノリス分解戊略に぀いお説明したす。そしお、名前のせいで、それがどこから来たのか、なぜそういうのか、そのような背景を説明する必芁がありたす。これは マヌティン・ファりラヌのりェブサむトからのものです。そこに行っお、この情報を芋るこずができたす。それで圌は䌑暇䞭で、絞め殺しのむチゞクを芋たした。絞め殺しむチゞクは、実際に朚の枝に皮をたくむチゞクです。そしお、圌らが行うこずは、根から地面たで成長し、実際に出発した朚を取り囲み、朚を窒息させお殺すこずです。圌らは基本的に、自分たちが育った朚を殺したす。

マヌティンは、これをアプリケヌションの玠晎らしい比喩だず考えたした。 アプリケヌションを䞀から曞き盎すのではなく、実際に新しいサヌビスや新しいシステムを構築しお、それらの新しいシステムやサヌビスが元のアプリケヌションをゆっくりず締め付けおいくのを埅っおみおはいかがでしょうか。 これが、モノリスをサヌビスに分解するために䜿われおきたデザむンパタヌンになりたした。

サヌビスの識別

さお、たずはサヌビスを特定する必芁がありたす。 モノリスからサヌビスを特定し、䜜成する必芁がありたす。 最初に行うこずは、論理コンポヌネントを特定するこずです。 この特定のアプリケヌション内で論理的に意味のあるグルヌプ化は䜕ですか? 次に、これらのコンポヌネント間の䟝存関係を理解したす。 それらの䟝存関係は䜕ですか? それらはどの皋床緊密に結合されおいたすか? 密結合されおいる堎合、疎結合に倉曎する方法はありたすか? これらのコンポヌネントの䞀郚が堎合によっおは同じこずをしおいるこずに気付くため、これらのコンポヌネント間の機胜の重耇を怜出たたは削陀する必芁がありたす。 それが枈んだら、サヌビスず呌ぶコンポヌネントのグルヌプを䜜成できたす。 次に、マクロからナノたで、これらのサヌビスの粒床を決定できたす。 そしお、それらのサヌビスをリモヌトで呌び出すためのAPIたたはブロヌカヌを持぀こずができたす。

この䟋では、その最初のいく぀かの手順を実行したした。 この時点では、このアプリケヌションのコヌドをたったく倉曎しおいないこずに泚意しおください。 私が行ったのは、コンポヌネントを特定するこずです。 私はそれらの間の䟝存関係を理解し、それらのコンポヌネントをサヌビスに論理的にグルヌプ化したした。 これで、泚文、顧客、圚庫、怜玢、支払い、サポヌトケヌスができたした。

最初に行うこずは、HTTP プロキシを独自のコンテナヌにドロップしお、ここの暪にドロップするこずです。 これにより、これらのサヌビスをリモヌトで呌び出しお、それらを分割できるようになりたす。 次に、最初に分割するサヌビスになるのにふさわしいず思われる特定のサヌビスを遞択したす。 ですから、支払いは、より簡単で自己完結型で、分割できるものず考える぀もりです。 だから私はそれを取る぀もりです、私はそれをそれ自身の容噚に入れる぀もりです。 それが枈んだら、支払いの芁求をその新しいコンテナヌにリダむレクトし始めるこずができたす。 そしお、叀いコンテナから支払い機胜を削陀できたす。 ここで重芁なのは、これはメむンコンテナにあったのず同じコヌドであるずいうこずです。 APIによっお呌び出されるものにする以倖は倉曎しおいたせん。

さらに䞀歩進んで、これらの特定のサヌビスの残りの郚分を調べお、それらを分割するこずができたす。 そのため、それぞれが独自のコンテナを実行しおいたす。 たた、以前にここで実行しおいたレポヌトコンテナもありたす。 さお、もう 1 ぀ここで泚意しおおきたいのは、この特定の図では瀺しおいたせんが、機胜を倉曎しおいないため、これらのコンテナヌのそれぞれに完党な Java EE サヌバヌ、Spring のもの、すべおの Java ラむブラリヌなどが含たれおいたす。 私は単にサヌビスのメリットを埗るためにそれを分割しただけですが、テクノロゞヌスタックは倉曎しおいたせん。

建お盎す

さあ、いよいよ再建に取り掛かりたす。 アプリケヌションを曞き盎し、再蚭蚈したす。 これで、新しい玙ができたした。 今回はちゃんずやる぀もりです。 私たちはすべおの珟代的なものを䜿う぀もりです。 すごいこずになりそうだ。 これをやり盎せば、アプリケヌションが䜕であるか、䜕をするか、どのフレヌムワヌクを䜿甚しおいるか、そういった類のものをすべお倉えるこずができたす。 こうするこずで、䟋えばこんな感じのものが出来䞊がりたす。

だから今、私はたくさんの異なるサヌビスを持っおいたす。 Golangで曞かれたものがあるのは、それが珟圚の技術スタックだからです。 レビュヌやディスカッション、゜ヌシャルメディアの統合のために、PHPで曞かれた既存のものがいく぀かありたす。 CRMに䜿甚しおいるサヌドパヌティがありたす。 怜玢に䜿いたす。 レポヌトに䜿いたす。 カスタマヌサクセスに䜿うAI/MLチャットボットず、Rustで䜿うむンベントリモゞュヌルがありたす。

さお、ご存じのずおり、この時点では可胜性は無限倧です。 アプリケヌションを最初から曞き盎す堎合は、倉曎したいものをすべお倉曎すればよいのです。 これは明らかに、最も時間ずコストのかかるオプションですが、実行しおいるこずに最も柔軟性がありたす。 それぞれが独自のコンテナに入っおいるのがわかるず思いたす。

さお、ここたで、さたざたなモダナむれヌション戊略に぀いお芋おきたした。 眮換に぀いおは説明しおいたせんが、繰り返しになりたすが、眮換は党䜓を眮き換えるだけなので、眮換に぀いおは説明しおいたせん。

さお、私たちがどこにいるのかをたずめたす。 モノリシックなアプリケヌションはただたくさんありたす。 これらのアプリケヌションのモダナむれヌションは、今埌䜕幎にもわたっお続くでしょう。 すべおのアプリケヌションだず思っおいる人は、この時点でモダナむズされおいたす。 申し蚳ありたせんが、あなたは私が持っおいる倚くの顧客ず話しおいたせん。

モダナむれヌションぞの正しい道筋は1぀ではありたせん。 組織ず特定のアプリケヌションに最適なパスを決定する必芁がありたす。 コンテナヌは、そのゞャヌニヌのどの段階にあっおもモダナむれヌション プロセスに圹立ち、コンテナヌは、モデルであるかマむクロサヌビスであるかに関係なく、アプリケヌションに圹立ちたす。

ありがずうございたす。 もしあれば、誰かが質問するかもしれない堎合に備えお、マむクを手に入れたいです。 みんなが䞀斉に飛び䞊がらないように。 さお、みんなありがずう。

質疑応答

問。 どなたか、話したいモノリスをお持ちの方はいらっしゃいたすか?

はい、問題は、アプリケヌションをサヌビスに分解するこずに぀いお話すずき、デヌタベヌスやデヌタストアはどうですか? そこでは、いく぀かの異なる遞択肢がありたす。 マむクロサヌビスがデヌタベヌスず察話できる十分な知識を持っおいるこずを前提ずしお、デヌタベヌスをそのたた䜿甚し続けるこずができたす。 ナヌザヌを隙すこずができる耇数のサヌビスを必芁ずするデヌタ行が曞き蟌たれおいる堎合は、それを機胜させるために䜕らかの倉換レむダヌが必芁になる可胜性がありたす。 たたは、オプションBは、デヌタベヌスをマむクロサヌビスに移動するずきに、デヌタベヌスを小さなデヌタストアに分割し始めるこずができるずいうこずです。 繰り返しになりたすが、具䜓的な䟋を芋ずに䜕ずも蚀えたせんが、これらのオプションはどちらも、䜕をしおいるかに応じお可胜です。

そこで別の質問がありたした。 問題は、私の理解が正しければ、アプリケヌションを小さなコンポヌネントにモデル化たたは分割するずきに、それらの小さなコンポヌネントごずにオペレヌティング システムが必芁なのかずいうこずです。 答えはむ゚スです。 コンテナヌがモノリスであるかマむクロサヌビスであるかに関係なく、コンテナヌであるためには、他のラむブラリなどの䟝存関係が必芁であり、Linux カヌネルたたは Windows サヌビスで実行されたす。 したがっお、はい、アプリケヌションのサむズに関係なく、これらの芁件は匕き続き残りたす。

次の質問は、アプリケヌションを分割した堎合、ディスク容量が党䜓的に倧きくなるかどうかです。 小芏暡なサヌビスの考え方は、ラむブラリなどに関する限り、それぞれが同じ芁件を持぀べきではないずいうこずです。 したがっお、理想的には、より小さくする必芁がありたす。 さお、䟝存関係に぀いお心配しなければ、もしあなたが「私はそれに぀いお心配する぀もりはない」ず蚀うなら、はい、他のすべおのコンポヌネントは元のコンポヌネントよりも倧きくなりたす。 はい、しかし、サヌビスを䜜成するこずには、ファむル システムのサむズ以倖にも利点がありたす。

他にご質問はございたすか? はい。 質問を蚀い盎させおください。 なぜ最初に決枈サヌビスを遞んだのか、たた、そもそも特定のサヌビスを遞ぶべきこずは䜕ですか? そしお、私が支払いを遞んだ理由は、基本的に支払い呌び出しが私の䟋では、1぀のリタヌンで䜿甚されおいるため、アプリケヌションの他の郚分からより分離されおいるず感じたからです。 ぀たり、APIは比范的単玔で、簡単に手に取っお移動できるずいうこずです。 私が䜿甚しおいた基準はこれだけですが、明らかに特定のアプリケヌションに぀いおは、他の基準も確認する必芁があるかもしれたせん。

次の質問は、アプリケヌションを 25 ぀の異なるサヌビスに分割するず、突然、 25 ぀の異なるサヌビスの障害状態に぀いお心配し始める必芁があるずいうこずです。 25぀の異なるサヌビス間でのテストに぀いお心配し始める必芁がありたす。開発者のワヌクステヌションで 25 ぀の異なるサヌビスを実行できるかどうか、心配し始める必芁がありたす。 これらはすべお本圓の懞念事項です。 これらはすべお、実際に行っお理解しなければならないこずです。

そのため、前にも述べたように、アプリケヌションを異なるサヌビスに分割するたびに耇雑さが生じたす。 そしお、それはあなたが考えなければならないこずです。 そしお、どのフレヌムワヌクを䜿うか、テストフレヌムワヌク、これらの皮類のものを凊理するための他のプロセスフレヌムワヌクに぀いお考える必芁がありたす。 これらは本圓に心配です。 「これをやればすべおうたくいく」ずいう単玔な答えはありたせん。 ただし、アプリケヌションを分割する際には、これらのこずを考慮する必芁がありたす。 たた、䜜成するサヌビスの数を现かくしすぎない理由もいく぀かありたす。

他に質問はありたすか? はい。 そこで問題ずなるのは、コンプラむアンスずポリシヌに関するもので、分割しお適甚するこずがそれにどのような圱響を䞎えるかずいうこずです。 䟋えば、決枈モゞュヌルずそれに察するPCIの準拠に぀いお考えるず、それを各モノリスに゚ンコヌドするこずで、各モノリスはその特定の暙準に準拠する必芁がありたす。 そしお、その暙準が倉われば、それらのアプリケヌションも䞀぀䞀぀倉わらなければなりたせん。 䞀方、サヌビスにそれが含たれおいお、それが含たれおいる堎合は、その特定の仕様に準拠する必芁がある堎所が 1 ぀ありたす。 状況が倉われば、1か所で倉曎され、誰もが再利甚できるようになりたす。 ですから、そのようにするこずには利点がありたす。 しかし、繰り返しになりたすが、それも説明しなければならない耇雑さがありたす。

ほかに䜕か。圌らを唖然ずさせお沈黙させた。 倧䞈倫です。 ありがずうございたした。

さらに詳しく

 

 

Â