マイクロサービス:MonolithFirst?


9

私はすべての長所と短所、いつ、なぜなどの高レベルの概要を取得しようとするマイクロサービスアーキテクチャを研究してきました。私が読んで/見ている情報の多くは、ThoughtWorks(Martin Fowler、Neal Fordなどからのものです) al)。

この問題に関するMartin Fowlerの仕事の大部分は数年前のものであり、Microservices(プログラミングの一般的な名称ではないが)がまだ若かったため、私はその多くを少しずつ理解しました。

特に、これは次のとおりです。

マイクロサービスアーキテクチャを使用するチームの話を聞いていると、共通のパターンに気づきました。

  • 成功したマイクロサービスストーリーのほとんどすべては、大きくなりすぎて分割されたモノリスから始まりました。
  • 最初からマイクロサービスシステムとして構築されたシステムについて聞いたほとんどすべての場合、それは深刻な問題に終わっています。

このパターンにより、多くの同僚は、アプリケーションが価値があるほど十分に大きいアプリケーションであっても、マイクロサービスで新しいプロジェクトを開始すべきではないと主張しました。。

(参照:https : //martinfowler.com/bliki/MonolithFirst.html-彼らを強調)

さて、3年後、マイクロサービスがよりユビキタスな言葉になりましたが、新しいシステムは通常、最初により大きい(-microservice-but-smaller-than-monolith)サービスチャンクを用意し、それらは進化的測定の一部としてより細かく?

または、上記のステートメントとは対照的に、きめ細かなマイクロサービスアーキテクチャを使用してプロジェクトをゼロから開始する基準はありますか?

正気な一般的なアプローチのようですが、コミュニティの考えに興味があります。

回答:


2

あなたの会社がしばらくの間マイクロサービスを行っている場合、いくつかの部分はすでに構築されている可能性があり、単にそれらを組み込む必要があります。例としては、サービスとしての認証やblobデータの保存などが考えられます。その場合、すでに境界を定義しており、新しいアプリケーションでコードを再利用しています。それはいいことだ。

境界をどこに置く必要があるかわからない新しいコードの場合は、1つのサービスでビルドします。モジュール化しておくと、必要に応じてマイクロサービスを分割できます。特に、他のサービスとは異なるスケーリングが必要なサービスの一部を見つけた場合。

マイクロサービスの利点は、インスタンスを追加して、オンデマンドで実行される作業をスケーリングできることです。作業の一部が急増している場合は、それを独自のマイクロサービスに分離することは理にかなっています。

一般に:

  • すでにマイクロサービスを構築している場合は、それらを再利用します
  • 新しいものを構築する場合は、まずアイデアを機能させます
  • 構築中は、一部のサービスを簡単に分割できるように、モジュール化を維持してください
  • 構築しているときに、サービスの一部をオンデマンドで異なるレートでスケーリングできるようにする必要がある場合は、それを独自のサービスに分離します

マーティンファウラーのような評判の高い賢い人々から有用なガイドラインが聞こえ、それから、決してそれを揺るがすことのできない堅固な教義に変えることがよくあります。

あなたはそれらの意味するところの精神でそのような発言をしなければなりません。マーティンファウラーは、分析によって人々を麻痺から救い、最初に機能する何かを構築するように伝えようとしています。アプリケーションが実際にどのように機能するかについて理解できたら、いつでも分解できます。


13

マイクロサービスの最も直接的な価値のある利点は、単純なコードのモジュール化によって実現できます。持っているモジュールシステム(maven、npm、nugetなど)を使用して、機能のグループをモジュールに分離できます。各モジュールは、単一の目的を果たすことができ、独自のリポジトリーに配置し、独自のDBスキーマを使用し、独自の構成を管理し、独自の機能バックログとリリーススケジュールを設定できます。それらは一体としてモノリスに配置することができます。これは非常に管理しやすいオーバーヘッドであり、いくつかの良い利点があります。より大きなオーバーヘッドは、デプロイメントを分離することから生じます。これは、それを必要とするのに十分な規模がある場合にのみ本当に価値があります。コードがすでにモジュール化されている場合は、時期が来れば移行が容易になります。


健全なように聞こえますが、一般的なコーディングのベストプラクティスとコードベース管理のわずかな改善を組み合わせたものですが、「マイナーサービスアップデートでモノリス全体を更新する必要はありません」パスには達していません。輝く。いずれにしても、良いアドバイス、ありがとう。
jleach

1
答えに完全に同意します。適切に構築され、正しくモジュール化されたモノリスは、マイクロサービスが持つほとんど(すべてではありません)の利点を提供します。一方、マイクロサービスにはかなり大きな問題があります。
ミロスMrdovic

@jleach優れたモジュール化の品質の1つは、独立した配置可能性です。マイナーモジュールの更新を行うためにモノリス全体を再コンパイルおよび再展開する必要がある場合は、何か問題があります。
ミロスMrdovic

2
これは良いアプローチです。マイクロサービスを行うためにマイクロサービスを構築しないでください。マイクロサービスアーキテクチャを使用して問題を解決する必要がありますが、マイクロサービスアーキテクチャには一連の独自の問題もあるので、これらのトレードオフの準備ができていない/気付いていない場合は、ゼロからマイクロサービスを開発する場合は十分に注意する必要があります。
リーライアン

1
@MilosMrdovicは、モジュールアプローチを使用していても、モノリス全体を再テストする必要がなく、更新しているモジュールのみを再テストする必要がないため、展開においてある程度の効率を得ることができます。モジュールがすべての品質ゲートを通過する場合、それを構築して出荷できます。次に、モノリスは依存関係のバージョンを更新して再デプロイするだけです。他のモジュールを再構築する必要はありません。
ジギー

2

私の意見では、最初にモノリスを開発すること(またはそれ以上:アプリケーションの一部をモノリスとして開発すること)は有益です。

ドメインと問題の境界がわからない場合があります(たとえば、船の管理サイトを構築したり、船サービスと艦隊サービスが必要ですか、それとも船サービスで十分ですか?)モノリスは開発が簡単です。

さまざまなテクノロジーを組み合わせる必要がある場合はこれをやめるべきです(たとえば、既存のパーツはC#で記述されていますが、新しい問題には機械学習が必要ですが、Pythonを使用するのが最適です)。プロジェクトやモノリスの扱いを活性化します。たとえば、誰もがこのモノリスを構築し、個別のサービスの概念を押しつぶすだけです。


1
「そしてそのような場合、マイクロサービスは開発が容易になる可能性があります」– そこでモノリスについて話すつもりでしたか?
エイモン

@amonありがとう、私は文章を修正しました-私の息子は私に34235回割り込みましたので、私は混乱しました;)
クリスチャンザウアー

私はあなたの最初の文に同意しますが、モノリスでさえもすでに「モジュールのような」ものである必要があると考えるべきです。そうしないと、すべてが落ちることなく何も分離することができません。
Walfrat

@Walfrat私は同意する傾向がありますが、既存のコードを再利用する誘惑は、モノリスではるかに大きくなります(押しつぶされにくくなります)。例えば、「ああ見て、誰かがwidgetIdが定義され、私はちょうど再利用の私のフォームIDのためにということでしょう」:また、あなたが簡単に本当に「誰もが共通のツールを使用しなければならない」思考育てる別の言語/プロジェクトのためデシベル、使用することはできません
クリスチャン・ザウアー

1

MFによるこの正確な記事には2、3の質問があったと思います。

私の考えはこれです:

メンテナンスやスケーラビリティの問題があるMonolithは、それをマイクロサービスに分解することで改善されます。このようなプロジェクトは、ほとんど常に「成功」​​します。小さなセクションを分割しても測定可能な利益が得られ、幸せなときにその下に線を引くことができるからです。

ハーフモノリス+メッセージキューといくつかのワーカープロセスが「マイクロサービスアーキテクチャ」としてカウントされるかどうかは、パブをダウンさせる論争ですが、プロジェクトについて話すとき、それを間違いなくそれと呼びます。

一方、選択したアーキテクチャに関係なく新しいプロジェクトを実行すると、期待に応えられないリスクが生じるため、当然、成功率は低くなります。さらに、「ベストプラクティスマイクロサービスアーキテクチャ」全体をゼロから作成することを目的としている場合は、新しいテクノロジーとマイクロサービスのハードビットに挑戦している可能性があります。

また、MFは大きなOOPの観点から書いていることを覚えておく必要があります。彼は当然、より現代的な分散型アプローチには懐疑的です。

この時代では、大規模なビジネスソリューションにマイクロサービスの要素を組み込むことを期待し、1つのデスクトップスタイルのアプリケーションを配布しない限り、愚か者だけが1つの巨大なモノリスアプリケーションを作成することを推奨します。


ありがとう。MFが少し偏っている傾向がある場合、遠近法の深さを得るために反対側で研究できる仕事をしている人はいますか?
jleach

「ウェブセレブ」を学習リソースとしてお勧めしません。いくつかの逸話と楽しい話にはそれで十分ですが、私の経験では、成功と失敗のすべての違いを生み出す詳細です。
ユアン

0

私の(vast)経験では、テクノロジーの問題よりも人の問題が原因で多くのプロジェクトが失敗するのを目にしました。残念ながら、人々は失敗を好まないので、失敗の理由を誤って報告し、テクノロジーのせいにする傾向があります。

私のドメイン、ファイナンスでは、最近のほとんどの新しいプロジェクトはマイクロサービスアーキテクチャに従っています。TCO(総所有コスト)の観点から見ると、これは成功するアーキテクチャのようです。これらのプロジェクトはそれほど頻繁に失敗しているようには見えません。また、プロジェクトが失敗した場合、アプリケーションアーキテクチャを問題として挙げることはあまりありません。


マイクロサービスは実際に多くの組織的な問題を解決します。各サービスに所有者がいる場合は、何かが機能しないときに窒息する方法を知っています。
ジギー

@jiggy:コードが適切にモジュール化されている場合、誰をチョークするかを知るために必ずしも複数のサービスに分割する必要はありません。
リーライアン

@ライアン、マイクロサービスとモジュール化が同義であると誰かが思うなら、彼らは完全にポイントを逃しました。
ソフトウェアエンジニア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.