web-dev-qa-db-ja.com

マイクロサービスに移行すると、実行時の問題がどのように発生しますか?

次の コメンテーターの書き込み

マイクロサービスは、組織の機能障害をコンパイル時の問題から実行時の問題にシフトします。

この コメンテーターは展開します と言う問題について:

機能はバグではありません。実行時の問題=>製品の問題=>責任者への機能障害に関するより強力で迅速なフィードバック

今私は get it with microservices あなた:

  • スループットのレイテンシが増加する可能性があります。これは、運用とランタイムの問題です。
  • 解析の実行時エラーが発生する可能性があるコード内の「ネットワークインターフェイス」の数を増やします。
  • 潜在的に青緑色の展開を行うことができます。それらは、インターフェイスの不一致によって妨げられる可能性があります(ネットワークインターフェイスを参照)。しかし、青緑色の展開が機能する場合は、実行時の問題のほうが多くなります。

私の質問は次のとおりです:マイクロサービスに移行するとランタイムの問題が発生するということはどういう意味ですか?

104
hawkeye

私は問題があります。マイクロサービスを使ってみよう!現在、13の分散問題があります。

システムをカプセル化された、まとまりのある、分離されたコンポーネントに分割することは良い考えです。さまざまな問題に個別に取り組むことができます。しかし、モノリシックな展開でそれを完全にうまく行うことができます( Fowler:Microservice Premium を参照)。結局のところ、これが何十年にもわたってOOPが教えてきたものです。コンポーネントをマイクロサービスに変えることに決めた場合、アーキテクチャ上の利点は得られません。テクノロジーの選択に関して柔軟性が得られ、場合によっては(必ずしもそうとは限りません!)ある程度のスケーラビリティ。ただし、(a)システムの分散性、および(b)コンポーネント間の通信に起因する頭痛が保証されます。マイクロサービスを選択すると、他の問題が発生し、これらの問題にもかかわらず、マイクロサービスを喜んで使用します。

コンポーネントに完全に分割されたモノリスを設計できない場合、マイクロサービスシステムも設計できません。モノリシックコードベースでは、痛みはかなり明白になります。理想的には、コードがひどく壊れている場合、コードはコンパイルされません。ただし、マイクロサービスを使用すると、各サービスを別々に、場合によっては異なる言語で開発することもできます。コンポーネントの相互作用に関する問題は、コンポーネントを統合するまで明らかになりません。その時点では、アーキテクチャ全体を修正するにはまだ遅すぎます。

バグの一番の原因はインターフェースの不一致です。パラメータの欠落などの明白な間違いや、エラーコードの確認を忘れたり、メソッドを呼び出す前に前提条件の確認を忘れたりといった、より微妙な例が考えられます。静的型付けは、このような問題を可能な限り早期に検出します。IDEおよびコンパイラーでは、before以前にコードが実行されます。動的システムでは、欠陥のあるコードが実行されるまで爆発しません。

マイクロサービスへの影響は恐ろしいものです。マイクロサービスは本質的に動的です。正式なサービス記述言語に移行しない限り、インターフェイスの使用状況がどのようなものであるかを検証することはできません。あなたはテストし、テストし、テストしなければなりません!ただし、テストは費用がかかり、通常は完全ではないため、本番環境に問題が残る可能性があります。その問題はいつ明らかになりますか?実行時に本番環境でその障害のあるパスが使用された場合のみ。 prodの問題がフィードバックの高速化につながるという考えは 陽気に データ損失の可能性に面白くない限り、危険なほど間違っています。

197
amon

最初のツイートは私のものだったので、詳しく説明します。

モノリシックアプリケーションに取り組んでいる開発者が100人いるとします。お互いに効果的にコミュニケーションするには人数が多すぎるため、会社はそれらを小さなチームに分割し、それらの間で優れたコミュニケーションパターンを作成するために懸命に努力する必要があります。組織が「機能不全」の場合、チームはおそらく互いに話し合っていない、より大きな目標に沿っていない、優先順位について意見が一致していないなど-結果として、何かを出荷するのに永遠にかかることになります。ソフトウェアが作成される前に機能障害が明らかであるという意味で、これは「コンパイル時の問題」です。プロジェクトはおそらく、死の行進であるか、決して出荷されることはありません(「コンパイル」)。

多くの人がマイクロサービスに惹かれ、マイクロサービスに移行していると思います。これは、固有の技術的/アーキテクチャ上の利点のためではなく、組織の機能不全を無視できるためです。 100人の開発者を揃えるのではなく、小さなチームがサイロで作業し、それぞれが小さなマイクロサービスに専念できることを期待しています。あなたがそのような機能不全の組織にいる場合、これはとても魅力的です:それはあなたがあなたが好きではない人々を避けるために、コミュニケーションしないためにはるかに大きな許可を与えます。

残念ながら、ソフトウェアが本番環境で実行されると、良好なコミュニケーションが同様に重要になるため、「ランタイムの問題」になります。組織の問題-チームとそれらの調整方法およびコミュニケーション方法-が「実行時」に明らかになります。

私のツイートの要点は、あなたが持っているものがpeople問題である場合、新しいアーキテクチャは役に立たないでしょう。問題の影響を遅らせるだけです。多くの人々にとってのマイクロサービスの魅力は、それがこれらの人々の問題を魔法のように解決することへの希望だと思います。

218
Paul Stovell

私の質問は:マイクロサービスに移行するとランタイムの問題が発生するということはどういう意味ですか?

つまり、それらのツイートが言っていることはではありません!彼らはマイクロサービスにをシフトすることについて何も言わず、作成する問題についても何も言いません。彼らはシフト問題について何かを言うだけです。

そして彼らは彼らの主張に文脈上の制限を課しました、すなわちあなたの組織は機能不全です。

つまり、firstツイートが基本的に言っていることは2つあります。

  • 「組織がマイクロサービスなしで複雑なシステムをエンジニアリングできない場合、魔法のようにマイクロサービスを使用して複雑なシステムを設計することはできません。」と
  • 「コンパイル時に、つまり開発中に現れるこの無力によって引き起こされる問題は、ランタイム中に、つまり本番中に現れます」(技術的には、テスト中にも現れる可能性がありますが、引用はそれ自体を制限します機能不全の組織(標準以下のテスト体制を持っている可能性が高い)へ)

ツイートでは、問題は本番環境でのみ発生する、つまり顧客がそれを目にするという事実は機能ではなくバグであると述べています。これは、ビルドが中断したときとは異なる場所、つまり組織の機能不全について何かを行うことができる場所(高レベルの管理など)で聞かれる傾向があるという顧客の不満です。組織の機能不全は通常、高レベルの管理の失敗であるため、これは、満足していない顧客が最終的にその不満の責任を負う人々に悪影響を及ぼすことを意味します。 、しかし、過失ではなく、それについて何かをすることができません。

したがって、最初のツイートでは、マイクロサービスは管理の悪さによって引き起こされる問題を、開発者だけが見るコンパイル時間から、顧客が見るランタイムに移すと述べています。 2番目のツイートは、それが良いことだと言っています。それは、問題が彼らの責任者を傷つけるからです。

43
Jörg W Mittag

compile-timeの問題ではなく、実行時の問題が発生します。

モノリシックアプリは、コンパイルするのが難しくコストがかかります。しかし、コンパイルすると、型システムがコンポーネントをキャッチできるため、コンポーネント間に極端に愚かな非互換性が存在しないことが合理的に確信できます。マイクロサービスのシステムでの同じエラーは、2つの特定のコンポーネント実際にが特定の方法で相互作用するまで表示されない場合があります。

9
Kilian Foth

モノリシックシステムとマイクロサービスの両方で、サブシステム間のインターフェイスを定義する必要があります。インターフェイスは、適切に設計され、十分に文書化され、できるだけ安定している必要があります。これはOOPと同じです。

組織がこれを行うことができない場合、マイクロサービスも問題を解決しません。マイクロサービスでは、パブリックWebインターフェイスがあります。そのため、インターフェース設計により多くの労力を費やす必要があります。

インターフェースが適切に設計されていないと、2種類の実行時の問題が発生します。

  1. インターフェースが正しく使用されていないと、コンパイル時ではなく実行時にエラーが発生します。
  2. Webインターフェースの呼び出しは非常に遅いため、パフォーマンスの問題が発生する可能性があります。

実行時の問題を生成することは、責任を負う人にとってコミュニケーションの組織的な問題の正しい方法ではないと思います。

2
bernie