非常に古い学校のアプローチに戻って、マイクロサービスで一周しましたか?


9

ソフトウェアのアーキテクチャと設計の観点から、マイクロサービスはミドルウェアに対してどのように「積み上げ」られますか(意図されていません)私はJavaから来ています。APIとしてのまっすぐなRESTから離れ、少なくともJavaでさまざまなレイヤーと接続パラメーターを抽象化すると、非常に古い学校のアイデアにほぼ完全に戻ってきたようです。仮想化に戻りました... JVMがすでに仮想化されているかどうか。

不可知論的な方法で、RESTful APIをCORBAに抽象化することができ、その利点を主張します。または、よりJava中心の方法で、JMSまたはMDB。

かつて、EJBはJavaで大きな問題でしたが、それがクラスター効果の一部であると認識されていましたが、今、最初に戻りましたか?

または、マイクロサービスは、CORBA、またはさらに優れたMDBにはないものを提供しますか?マイクロサービスの説明(TLDR)Martin Fowlerを読んだとき、もしそうなら、それは悪い問題の良い解決策として私を驚かせます。むしろ、問題を押し広げるだけの複雑さのレベルをもたらすクローズドマインドアプローチ。サービスが本当にマイクロで数が多い場合、それぞれのサービスの実行と維持に1ドルのコストがかかります。

さらに、多くの中で1つのマイクロサービスがそのAPIを変更すると、そのサービスに依存するすべてが壊れます。それはしないように見えるそれは、疎結合思わアジャイルの反対を。それとも私はそれらの言葉を誤用していますか?

もちろん、これらの両極端の間には不確定な量の選択肢があります。

サメ対ゴリラ...行く! (知識を深めるために、それは皮肉なことを意味し、私の意図ではありません。質問は額面通りに受け取られることを意味します。質問を改善できる場合は、そうするか、コメントしてください。修正します。 )

Dockerで実行されている多数のマイクロサービスがすべて1台のマシンで実行され、互いに対話していることを想像してください...狂気。保守や管理が難しく、変更を重ねると予期しないエラーが発生するため、何も変更することはほとんど不可能です。これらのサービスが異なるマシンに分散していることはどういうわけですか?そして、それらが分散されている場合、確かに、非常に古くからあるいくつかの手法が、少なくともある程度、分散コンピューティングを解決しています。

なぜ水平スケーリングが普及しているか、少なくとも望ましいのですか?


4
閉じる投票。何を求めているのか、なぜそれを求めているのかは不明です。マイクロサービスアーキテクチャは、単なる別のアーキテクチャです。それ以上でもそれ以下でもありません。
davidk01 2015年

1
また、この記事は価値があるかもしれません:devweek.com/blog/microservices-the-good-the-bad-and-the-ugly
davidk01

1
私は「だから今は何百もの小さな偽のサービスがあり、モノリスの代わりに、誰かがそれらのサービスの1つの契約を変更したいときに何が起こるかを心配する必要があります。別の名前の糸の玉。代わりに彼らが変更を加えた場合にコードがコンパイルされるかどうか疑問に思っている彼らは、実際にはそれが実行されるかどうか疑問に思っています。」- 不機嫌そうな首ひげ 免責事項のマイクロサービス:いいえ、私は首ひげではありません。それは単なる滑稽な記事です。
Thufir 2015年

「コードがコンパイルされるかどうか疑問に思うのではなく...彼らはそれが実行されるかどうか疑問に思う...」実際、これはまったく問題ではありません。単に、開発者が関係者全員に通知せずに契約を変更した場合-その開発者は非常に強くスパンする必要があるためです。文字通り。私たちが定期契約を使用している場合、あなたのモバイルプロバイダーがあなたに尋ねたり通知したりせずに契約条件を変更すると想像してみてください?それが契約である理由-関係するすべての関係者は契約の変更を認識/同意する必要があり、この変更が発生した場合(適切な開発フローを前提とする)はすべてテストして円滑に実行する必要があります。
Alexey Kamenskiy 2015年

1
@Thufir MSが別のアプローチになる前に述べたように、MSには利点と欠点があります。私は実際に、複数のプロジェクトでこのアプローチを使用しました(それが特別な名前を持っていると聞いた前でも)。補足として-それは滝ではなく、あなたが作るものです。私は、モバイルOSの一部を(チームで)開発している1つのプロジェクトで働いていたため、OSをにすることができないため、このアプローチが唯一の方法です。OS giant blobはインターフェイスを持つ必要があるため、カーネルから始まる各部分は、MSのようなものであり、最初にコードを書き始めたチームは、仕様v0.0.1に同意することでした。
Alexey Kamenskiy 2015年

回答:


2

TL; DR。私はマイクロサーバー風のクールエイドをたくさん飲むことができたので、その背後にある理由について少し話すことができます。

長所:

  • サービスは、依存関係が安定していて、焼き込む時間があったことを知っています
  • 新しいバージョンのローリングデプロイメントを許可する
  • 上位層に影響を与えずにコンポーネントを元に戻すことができます。

短所:

  • 依存関係の新機能や光沢のある機能は使用できません。
  • APIの下位互換性を壊すことは決してありません(少なくとも、多くの開発サイクルではそうではありません)。

マイクロサービスアーキテクチャの仕組みを根本的に誤解していると思います。それが実行されることになっている方法は、すべてのマイクロサービス(以降、MSと呼ばれます)は、すべてのクライアントが同意する厳密なAPIを持つことです。MSは、APIが保持されている限り、必要な変更を加えることができます。APIが保持されている限り、MSを破棄して最初から書き直すことができます。

疎結合を支援するために、すべてのMSはその依存関係のバージョンn-1に依存しています。これにより、現在のバージョンのサービスが不安定になり、リスクが少し高くなります。また、バージョンを波状に出すこともできます。最初の1つのサーバーがアップグレードされ、次に半分、最後に残りのサーバーがアップグレードされます。現在のバージョンで重大な問題が発生した場合、MSは他のレイヤーの機能を失うことなく、以前のバージョンにロールバックできます。

APIを変更する必要がある場合は、下位互換性のある方法で変更する必要があります。


「MSは、APIが保持されている限り、破棄して最初から書き直すことができます。」-新しいことはありませんが、大丈夫です。パフォーマンスの面では、スペクトルの反対側で、これらすべてのMSはモノリシックアプリ/サービス/システムとどのように比較されますか?配布に関しては、のように聞こえますが、間違っている場合は訂正してください。単一のマシンにn個のMSを配置すると、パフォーマンスが向上する可能性があります。メインフレームで仮想化されていますか?MSを水平方向に拡大すればするほど、垂直方向に拡大するのが簡単になるようなものです...?私の質問を読まないことのボーナスポイント:)
Thufir 2015年

1
インダイレクションのどのレイヤーでもそうであるように、泥の大きなボールと比較して、パフォーマンスヒットを受けています。MSの場合、すべての呼び出しでネットワークラウンドトリップを行うため、特にコストがかかります。仮想化またはコンテナーを使用すると、呼び出しが実際にマシンを離れることがないため、この往復は大幅に短くなります。また、ハードウェアコストを抑えながら、より多くの分離(暴走サービスがピアを傷つけることはありません)を実現できます。
Konstantin Tarashchanskiy 2015年

5

私たちがこれまでに発明したすべてのソフトウェア開発手法は、どういうわけか複雑さを管理することに関するものでした。それらの大部分は、抽象化、カプセル化、疎結合に関するものであり続けています。マイクロサービスは、これらのことを実行するもう1つの方法です。これが、高い理論レベルで多くの古い技術に似ている理由ですが、それによって、有用性や関連性が低くなることはありません。

疎結合に関しては、目標を少し誤解していると思います。タスクAがタスクBを呼び出す必要がある場合、AとBを100%分離する方法はありません。起こることはありません。あなたができることは、タスクBがタスクCを呼び出した場合、タスクCがAへの変更について心配する必要がないことを確認することです。これらの3つのタスクがすべて1つの大きなblobでリンクされ、互いに構造体を渡す場合、それらのいずれかが変更した場合、それらはすべて変更しなければならない大きなチャンスです。しかし、3つすべてがマイクロサービスである場合、基本的には、Aへの変更がBの更新を強制するだけであることが保証されます(Aのコア機能への大きな変更であり、おそらくそれをまったく新しいサービスにする必要がある場合を除く)。これは、すべてのマイクロサービスの更新が下位互換性のある方法で行われる場合に特に当てはまります。

アジャイルコメントに関しては、個人的な経験から、私たちのマイクロサービスyコードは、「大きなblobにリンクされた」コードよりもアジャイルではるかに優れていることがわかります。後者の場合、誰かが低レベル関数のバグを修正するときはいつでも、彼は文字通りR&D部門全体に「タスクを再リンクしてください。さもないとすべて金曜日にクラッシュします」という電子メールを送信しなければなりません。私たちは毎週これらのカップルを受け取ります。彼のコードがマイクロサービス内にあった場合、彼が新しいバージョンをデプロイするとすぐに、すべての修正が自動的に修正の恩恵を受けます。

COBRAとMDBに関するコメントは完全には理解していません。これらはソフトウェアアーキテクチャではなく、むしろそれらのコンポーネントのようです。私の理解では、これらは、マイクロサービスのメッセージングプロトコルを定義する方法や、マイクロサービスの代わりになるものではなく、マイクロサービスを実装するための潜在的な方法です。


1
「これら3つのタスクがすべて1つの大きなblobでリンクされている場合...」私はこれについてJavaの観点しか持っていませんが、「いいえ」と言って、それをしないでください。C.はB のみのクライアントであり、Aのクライアントではないため、ライブラリ、API#1、API#2などを作成して、「.. task CがAへの変更について心配する必要はない」という正確なポイントを達成します。。その点で、私はそれがまったく新しいとは思いません、ご容赦ください。私が尋ねた質問はあいまいであったことを知っています。私はそれが何であるかについて曖昧なので、それは曖昧な質問です。私の語彙を助けるためにだけでさえ、すべての答えは私にとって役に立ちました。
Thufir 2015年

1
@Thufirライブラリがすべて動的にリンクされており、タスクがすべてまったく同じマシンのセットで実行されている場合、その通りです。実際には、個別のロールアウトが可能です。しかし、マイクロサービスを使用すると、デカップリングでそれを実現したい場合でも、これらの前提条件を削除できます。しないことは完全に合理的です。
Ixrec 2015年

CORBAは(かつて)分散アーキテクチャを定義するための広範な名前がまだなかったときに(1990年後半)一度に分散アーキテクチャを可能にする分散テクノロジです。大まかな、または細かいCORBAベースのシステムを自由に実装して、後でSOAまたはマイクロサービスと呼ばれるものにすることができます。CORBAは生き残れませんでしたが、別のテクノロジーを使用して、もう一度やり直しています。しかし、問題はテクノロジーではありませんでした。だから、はい、丸一周します。その過程で何かを学んだことを願っています。
xtian

4

これらのサービスが異なるマシンに分散していることはどういうわけですか?

クラウドのため。

もう笑った?しかし真剣に-多くの企業にとって、ソフトウェアの最大のコストはもはやソフトウェアではありません。それは帯域幅、ハードウェア、CDNコストなどです。すべての人がモバイルデバイスを手に入れているので、トラフィックはそれだけ多くなります。そして、それはあなたのトースターが独自のインターネット接続を取得するときにのみ悪化します。

したがって、企業はこれらのコストの管理を検討しています。具体的には、彼らは「この問題が解決した場合、ソフトウェアを取得または使用する何百万人もの人々にサービスを提供するにはどうすればよいか」というビジネス上の問題に対処しようとしています。 ?」

なぜ水平スケーリングが普及しているか、少なくとも望ましいのですか?

それはこの(巨大で増大する)ビジネス問題に答えるためです。

12人のユーザーがいる場合、すべてのサービスを1つのボックスにまとめることができます。あなたは1箱だけを支払いたいので、これは良いことです。また、ビジネスの規模が拡大したときに、さまざまなサービスを分割するためのアプリの変更に料金を支払う必要もありません。最近では、顧客の群れがサーバーに火を点ける前にそれを行う時間はありません。

また、サーバーの割り当てを調整して次のことができるので、優れています。

  1. 持っているサーバーのほとんどを使用して、「無駄」をほとんど残さない。
  2. ソフトウェアの個々の要素のパフォーマンスを測定します。
  3. リリースによる展開/ダウンタイムを削減します。

非常にきめ細かい展開を行うと、これら2つのことを簡単に/より良くすることができます(懸念事項の分離を強化するのに役立つことに加えて)。


わかりました、利点がわかります。参入障壁は低いですが、拡大する可能性があります。MSを水平方向にスケーリングしたときにループが発生するのは、おそらく非常に...レトロなようです。何か。なぜそれが間違っているように見えるのか、私は言葉を言うことができません。
Thufir、2015年

アプリケーションのスケーリングは、必ずしもマイクロサービスを必要としない問題です。AWSで非常に簡単にVMの能力を(オンデマンドでも)増やすことができます。または、従来のアーキテクチャのロードバランサーの背後にVMを追加することもできます。
xtian

@xtian-確かに、しかし、あなたはしばしば間違ったものをスケーリングしているので、必要以上に多くのお金を費やしています。マイクロサービスの背後にある考え方は、必要なもの(CPU、メモリ、ディスク、スループット、
GPU
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.