モノリスのスケーリングとマイクロサービスのスケーリング


15

マイクロサービスを使用するための一般的な議論の1つは、スケーラビリティの向上です。しかし、私はこの議論が本当に有効かどうか疑問に思います。

10個のマイクロサービスで構成されるアプリケーションがあり、そのうちの9個がそれぞれ2つのインスタンス(冗長性のため)を持ち、そのうちの1つが負荷を処理する4つのインスタンス(スケーラビリティー)を持つとします。この場合、マイクロサービスの賛成論は、このmiroserviceを他のサービスとは無関係にスケーリングできるということです。

ただし、10個のマイクロサービスすべてが単一のモノリスのモジュールであり、このモノリスのいくつかのインスタンス(たとえば上記の合計のような22個)がデプロイされたとしましょう。システムは、1つの重要な部分の負荷を処理できる必要があります。そうするのに十分なインスタンスがあるためです。インスタンスに不要なプログラムロジックが含まれている場合、唯一の欠点は、バイナリと必要なRAMの量がわずかに大きくなることです。しかし、この場合も、ほとんどの場合、差はあまり大きくないはずです-少なくともスタックの残りの部分と比較してはなりません(Spring Bootを考えてください)。スケーリングされたモノリスの利点は、分散システムの(ほとんど)誤りを伴わないシンプルなシステムになります。

何か不足していますか?


3
あなたはどれくらい大きなモノリスを話しているのですか?私はそれが「わずかに大きい」量のRAM以上であると思うからです。デプロイメント時間は言うまでもありません-バグの修正には4回ではなく22回のデプロイメントが必要になる場合があります。しかし、モノリスが小さく、デプロイメントに時間がかからない、データベースの移行に時間がかからない、などです。
トーマスオーエンズ

私はコードの行を数えませんでしたが、モノリスには数千行のコードがあります(巨大なシステムではありません)。私の検討の出発点は、実際のアプリケーションコードのサイズが、SpringやHibernateなどの大きなフレームワークに比べて小さいことです。インスタンスが2つある場合、すでに基本的な冗長性があり、より多くのインスタンスがスケーラビリティのために配置されるため、展開の数は実際にはマイクロサービスよりも少なくなります。
デーモン

@deamonモノリスアプローチでは、各インスタンスで完全に停止するコード部分はなく、めったに使用されないコードがあることに注意してください。現在、コード自体は少量のメモリしか消費しない場合がありますが、メモリ内で大量のオブジェクトを使用すると、その量が大幅に増加する可能性があります。
フランクホプキンス

基本的な「コードを実行する」オーバーヘッドは、jvm全体がサービスイメージの一部であることが多いJavaアプリケーションで知っているほど大きくなるとは限りません。
フランクホプキンス

回答:


22

マイクロサービスのポイントは、プロセッサーの負荷を減らすことではありません。実際、以前はグローバルユーティリティコードであった通信のオーバーヘッドと機能の繰り返しのため、通常プロセッサの負荷がいくらか増加します。

モノリスを廃止するポイントは、機能の複雑なシステムをまったく維持、展開、実行できることです。システムが一定のサイズに達すると、コンパイル、テスト、デプロイなどが行われますが、モノリスは高価になりすぎて、適切な稼働時間を維持できません。マイクロサービスを使用すると、システムの断片をアップグレード、再起動、またはロールバックできます。

ミスをしないでください。マイクロサービスはリモートインターフェイスを介して疎結合するための本質的に優れたソリューションであるため、マイクロサービスを作成しません。実際、モノリスが提供できる強力な型と一貫性チェックの喪失は、しばしば大きな欠点です。我々はので、それを行う我々がしなければならない複雑さが私たちのより良いを得ているため、と次善の状況のベストを作っています。


2
同意した。マイクロサービスアーキテクチャに移行する理由は、ほとんど政治的なものです。分散負荷、デカップリングは結果であり、原因ではありません。マイクロサービスの本当の利点は、SDLCとガバナンスにあります。これに加えて、アーキテクチャは、ほとんどの場合、会社の市場戦略から生じるニーズに対する論理的な応答です。同社は、新たな戦略を採用することを許可されているので、市場投入までの時間は、スムーズかつ迅速に一方から他方へのシフト、モノリス・アーキテクチャよりも短くなっている
LAIV

6
だから誰かが中小規模のアプリケーションのマイクロサービスに直接行くべきではないのです。システムのオーバーヘッドと追加された複雑さは、それらの規模で、モノリシックシステムよりも多くの時間、お金、および品質を要することになります。
T.サー

»複雑さは私たちをより良くしており、次善の状況を最大限に活用しているからです。私にとって、それは釘です!
トーマスジャンク

私は答えの最後の部分に反対しなければなりません。マイクロサービスは複数のコンピューターを利用するため、本質的にモノリスよりも優れています。
ユアン

1
@ewanモノリスで複数のコンピューターを使用することもできます。
デーモン

3

あなたはほとんど正しいです。均等にロードされるクイックサービスがある場合は、すべてのボックスにそれらをすべてインストールすることもできます。サービスごとにボックスを用意するほど「素敵」ではありませんが、お金を節約できます。

しかしながら。サービス5がCPUの100%を2分間使用すると言うアンバランスが発生したら、他のすべてのサービスが実行されてもブロックされないように、そのサービスを専用のボックスに移動します。

ロードのためにサービス5への呼び出しがタイムアウトした場合、すべてではなくアプリの一部の機能のみが失敗します。

これで、モジュール化されたモノリスでも同じことができます。すべてのサービスをインストールしますが、そのうちの1つにサービス5トラフィックのみをルーティングします。サービス5のトラフィックを他のボックスにルーティングしない間。

しかし、通常、モノリスはその性質上、同じボックスにインストールされるサービスのゆるいコレクションではありません。モジュール間でメモリ内の呼び出しが発生し、アプリのエラーが発生します。


1

マイクロサービスのポイントは、1)関心の分離と2)負荷の分散です。基本的に、これにより、そのタスクに固有のテクノロジーを使用してできる限り最高のブラックボックスサービスを作成できます。私たちのサービスは多言語であり得ます-それは異なるスタック上の異なるプログラミング言語で書かれています。APIの契約を超えて他のチームがどのように機能するかを知らなくても、さまざまなチームが各サービスに取り組むことができます。これを全体として考えると、パフォーマンスをデバッグ、理解、および調整しやすい、各サービスのコードベースがはるかに単純になります。


私は部分的に同意します。私のポイントは、一般的なマイクロサービスの議論ではなく、スケーラビリティに関するものでした。私の特定のケースでは、たとえば、マイクロサービスはすべて同じテクノロジーで記述されています。そのため、それぞれに異なるテクノロジーを使用することは可能ですが、ここではそうではありません。スケーラビリティに関する重要なポイントを見逃していないことを確認したかったのです。
デーモン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.