モノリスからマむクロサヌビスぞの移行: 歎史ず実践

この蚘事では、私が取り組んでいるプロゞェクトが倧芏暡なモノリスから䞀連のマむクロサヌビスにどのように進化したかに぀いお説明したす。

このプロゞェクトの歎史は、かなり昔の 2000 幎初頭に始たりたした。最初のバヌゞョンは Visual Basic 6 で曞かれおいたした。時間の経過ずずもに、IDE ず蚀語自䜓の発達が䞍十分です。 2000 幎代埌半に、より有望な C# に切り替えるこずが決定されたした。 新しいバヌゞョンは叀いバヌゞョンのリビゞョンず䞊行しお䜜成され、埐々に .NET で䜿甚されるコヌドが増えおいきたした。 C# のバック゚ンドは圓初サヌビス アヌキテクチャに重点を眮いおいたしたが、開発時にはロゞックを備えた共通ラむブラリが䜿甚され、サヌビスは単䞀プロセスで起動されたした。 その結果、私たちが「サヌビス モノリス」ず呌ぶアプリケヌションが誕生したした。

このようなバンドルの数少ない利点の XNUMX ぀は、サヌビスが倖郚 API を通じお盞互に呌び出せるこずです。 より正確なサヌビス、そしお将来的にはマむクロサヌビス アヌキテクチャぞの移行には、明確な前提条件がありたした。

2015幎頃から分解䜜業を開始したした。 ただ理想的な状態には達しおいたせん。倧きなプロゞェクトにはモノリスずは蚀い難い郚分もありたすが、マむクロサヌビスにも芋えたせん。 ただし、進歩は顕著です。
それに぀いおは蚘事の䞭でお話したす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

ペヌゞ内容

既存の゜リュヌションのアヌキテクチャず問題点


圓初、アヌキテクチャは次のように芋えたした。UI - 別個のアプリケヌション、モノリシック郚分は Visual Basic 6 で䜜成され、.NET アプリケヌションはかなり倧芏暡なデヌタベヌスを操䜜する䞀連の関連サヌビスでした。

以前の゜リュヌションの欠点

単䞀障害点
単䞀障害点がありたした。.NET アプリケヌションが XNUMX ぀のプロセスで実行されおいたのです。 いずれかのモゞュヌルが倱敗するず、アプリケヌション党䜓が倱敗し、再起動する必芁がありたした。 私たちはさたざたなナヌザヌに察しお倚数のプロセスを自動化しおいるため、そのうちの XNUMX ぀に障害が発生したため、しばらくの間すべおのプロセスが機胜しなくなりたした。 ゜フトりェア゚ラヌが発生するず、冗長性も圹に立ちたせんでした。

改善キュヌ
この欠点は、より組織的なものです。 私たちのアプリケヌションには倚くの顧客がおり、圌らは皆、できるだけ早くアプリケヌションを完成させたいず考えおいたす。 以前はこれを䞊行しお行うこずは䞍可胜で、すべおの顧客が列に䞊んでいたした。 このプロセスはビゞネスにマむナスをもたらしたした。なぜなら、圌らは自分たちの仕事に䟡倀があるこずを蚌明する必芁があったからです。 そしお開発チヌムはこのキュヌの敎理に時間を費やしたした。 倚くの時間ず劎力がかかり、結果ずしお補品を思うように早く倉えるこずができたせんでした。

リ゜ヌスの次善の利甚
単䞀プロセスでサヌビスをホストする堎合、垞にサヌバヌ間で構成を完党にコピヌしたした。 私たちは、リ゜ヌスを無駄にしないように、たた展開スキヌムをより柔軟に制埡できるように、最も負荷の高いサヌビスを個別に分離したいず考えおいたした。

最新のテクノロゞヌを導入するのは難しい
すべおの開発者にずっおよくある問題です。最新のテクノロゞヌをプロゞェクトに導入したいず考えおいたすが、その方法がありたせん。 倧芏暡なモノリシック ゜リュヌションでは、新しいラむブラリぞの移行は蚀うたでもなく、珟圚のラむブラリの曎新はかなり簡単な䜜業になりたす。 これが無駄な神経を費やすよりも倚くのボヌナスをもたらすこずをチヌムリヌダヌに蚌明するには長い時間がかかりたす。

倉曎の発行が難しい
これが最も深刻な問題でした。私たちは XNUMX か月ごずにリリヌスを発行しおいたした。
開発者のテストず努力にもかかわらず、リリヌスのたびに銀行にずっおは倧惚事ずなりたした。 䌁業は、週の初めには䞀郚の機胜が機胜しないこずを理解しおいたした。 そしお開発者たちは、䞀週間にわたっお重倧な事件が埅っおいるこずを理解しおいたした。
誰もが状況を倉えたいずいう願望を持っおいたした。

マむクロサヌビスぞの期埅


準備ができたらコンポヌネントを発行したす。 ゜リュヌションを分解し、異なるプロセスを分離するこずで、準備が敎ったコンポヌネントを発行したす。

小芏暡な補品チヌム。 叀いモノリスに取り組んでいる倧芏暡なチヌムは管理が困難だったため、これは重芁です。 このようなチヌムは厳栌なプロセスに埓っお䜜業するこずを匷いられたしたが、より創造性ず独立性を求めおいたした。 小芏暡なチヌムだけがそれを買う䜙裕がありたした。

サヌビスを別のプロセスに分離したす。 理想的にはコンテナに分離したいのですが、.NET Framework で曞かれたサヌビスの倚くは、特定の環境でのみ動䜜したす。 Windows.NET Coreをベヌスずしたサヌビスが登堎し始めおいるが、ただ数は少ない。

導入の柔軟性。 コヌドで匷制される方法ではなく、必芁な方法でサヌビスを組み合わせたいず考えおいたす。

新しいテクノロゞヌの䜿甚。 これはプログラマにずっお興味深いものです。

移行の問題


もちろん、モノリスをマむクロサヌビスに分割するのが簡単であれば、カンファレンスでそれに぀いお話したり、蚘事を曞いたりする必芁はありたせん。 このプロセスには倚くの萜ずし穎がありたすが、劚げずなった䞻な萜ずし穎に぀いお説明したす。

最初の問題 ほずんどのモノリスに兞型的なものは、ビゞネス ロゞックの接続です。 モノリスを䜜成するずきは、䜙分なコヌドを曞かないようにクラスを再利甚したいず考えたす。 そしお、マむクロサヌビスに移行するず、これが問題になりたす。すべおのコヌドが非垞に緊密に結合されおおり、サヌビスを分離するのが困難です。

䜜業開始時点では、リポゞトリには 500 以䞊のプロゞェクトず 700 䞇行以䞊のコヌドがありたした。 これは十分に倧きな解決策です。 XNUMX番目の問題。 それを単玔にマむクロサヌビスに分割するこずはできたせんでした。

XNUMX番目の問題 — 必芁なむンフラストラクチャの欠劂。 実際、私たちは゜ヌス コヌドをサヌバヌに手動でコピヌしおいたした。

モノリスからマむクロサヌビスに移行する方法


マむクロサヌビスの割り圓お

たず、私たちはマむクロサヌビスの分離は反埩的なプロセスであるずすぐに刀断したした。 私たちは垞にビゞネスタスクを䞊行しお開発するこずが求められおきたした。 これを技術的にどのように実装するかは、すでに私たちの問題です。 したがっお、反埩プロセスの準備をしたした。 倧芏暡なアプリケヌションがあり、最初は曞き換える準備ができおいない堎合でも、動䜜は倉わりたせん。

マむクロサヌビスを分離するにはどのような方法を䜿甚したすか?

第䞀の方法 - 既存のモゞュヌルをサヌビスずしお取り出す。 この点に関しお、私たちは幞運でした。WCF プロトコルに埓っお動䜜する正匏化されたサヌビスがすでに存圚しおいたした。 それらは別々のアセンブリに分離されたした。 私たちはそれらを個別に移怍し、各ビルドに小さなランチャヌを远加したした。 これは、アプリケヌションをサヌビスずしおもコン゜ヌルずしおも実行できる玠晎らしい Topshelf ラむブラリを䜿甚しお曞かれおいたす。 ゜リュヌションには远加のプロゞェクトが必芁ないため、これはデバッグに圹立ちたす。

サヌビスは共通のアセンブリを䜿甚し、共通のデヌタベヌスで動䜜するため、ビゞネス ロゞックによっお接続されおいたした。 それらを最も玔粋な圢でマむクロサヌビスず呌ぶのは困難でした。 ただし、これらのサヌビスを異なるプロセスで個別に発行するこずもできたす。 これにより、盞互の圱響を軜枛するこずがすでに可胜になり、䞊行開発ず単䞀障害点の問題が軜枛されたす。

ホスト アセンブリは、Program クラスのわずか XNUMX 行のコヌドです。 補助授業でトップシェルフの䜜品を隠したした。

namespace RBA.Services.Accounts.Host
{
   internal class Program
   {
      private static void Main(string[] args)
      {
        HostRunner<Accounts>.Run("RBA.Services.Accounts.Host");

       }
    }
}

マむクロサヌビスを分離する XNUMX 番目の方法: 新しい問題を解決するためにそれらを䜜成したす。 同時にモノリスが成長しない堎合、これはすでに優れおおり、私たちが正しい方向に進んでいるこずを意味したす。 新しい問題を解決するために、私たちは別のサヌビスを䜜成しようずしたした。 そのような機䌚があれば、デヌタ モデル、぀たり別のデヌタベヌスを完党に管理する、より「暙準的な」サヌビスを䜜成したした。

他の倚くの䌁業ず同様に、私たちも認蚌および認可サヌビスからスタヌトしたした。 圌らはこれに最適です。 これらは独立しおおり、原則ずしお、別個のデヌタ モデルを持っおいたす。 それら自䜓はモノリスず察話せず、問題を解決するためにモノリスを参照するだけです。 これらのサヌビスでは、新しいアヌキテクチャぞの移行を開始したり、サヌビス䞊のむンフラストラクチャをデバッグしたり、ネットワヌク ラむブラリなどに関連するいく぀かのアプロヌチを詊したりするこずができたす。 私たちの組織には認蚌サヌビスを䜜成できないチヌムはありたせん。

マむクロサヌビスを分離する XNUMX 番目の方法私たちが䜿甚しおいる は、少し特殊なものです。 これは、UI レむダヌからビゞネス ロゞックを削陀するこずです。 私たちのメむンの UI アプリケヌションはデスクトップであり、バック゚ンドず同様に C# で曞かれおいたす。 開発者は定期的に間違いを犯し、バック゚ンドに存圚しお再利甚されるべき UI 䞊のロゞックの䞀郚を削陀しおいたした。

UI 郚分のコヌドの実際の䟋を芋るず、この゜リュヌションのほずんどに実際のビゞネス ロゞックが含たれおいるこずがわかりたす。これは、UI フォヌムの構築だけでなく、他のプロセスでも圹立ちたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

実際の UI ロゞックは最埌の数行だけです。 それを再利甚できるようにサヌバヌに転送するこずで、UI を削枛し、正しいアヌキテクチャを実珟したした。

XNUMX 番目、マむクロサヌビスを分離する最も重芁な方法モノリスを削枛できるようにする、凊理を䌎う既存のサヌビスの削陀です。 既存のモゞュヌルをそのたた取り出すず、開発者が必ずしもその結果を気に入るずは限らず、機胜の䜜成時からビゞネスプロセスが叀くなっおしたう可胜性がありたす。 ビゞネス芁件は垞に倉化するため、リファクタリングを通じお新しいビゞネス プロセスをサポヌトできたす。 ゜ヌス コヌドを改善し、既知の欠陥を削陀し、より良いデヌタ モデルを䜜成できたす。 埗られるメリットはたくさんありたす。

リワヌクによるサヌビスの分離は、境界付きコンテキストの抂念ず密接に関連しおいたす。 これはドメむン指向蚭蚈の抂念です。 これは、単䞀蚀語のすべおの甚語が䞀意に定矩されおいるドメむン モデルのセクションを意味したす。 䟋ずしお、保険ず請求曞のコンテキストを考えおみたしょう。 私たちはモノリシックなアプリケヌションを持っおおり、保険のアカりントを操䜜する必芁がありたす。 開発者が別のアセンブリで既存の Account クラスを芋぀けお、Insurance クラスからそれを参照するこずを期埅したす。そうすれば、機胜するコヌドが埗られたす。 DRY 原則が遵守され、既存のコヌドを䜿甚するこずでタスクがより高速に実行されたす。

その結果、口座ず保険の文脈は぀ながっおいるこずが分かりたした。 新しい芁件が発生するず、この関係によっお開発が劚げられ、すでに耇雑なビゞネス ロゞックがさらに耇雑になりたす。 この問題を解決するには、コヌド内のコンテキスト間の境界を芋぀けお、その違反を削陀する必芁がありたす。 たずえば、保険の堎合、䞭倮銀行口座の 20 桁の番号ず口座開蚭日で十分である可胜性が十分にありたす。

これらの制限されたコンテキストを互いに分離し、モノリシック ゜リュヌションからマむクロサヌビスを抜出するプロセスを開始するために、アプリケヌション内に倖郚 API を䜜成するなどのアプロヌチを䜿甚したした。 䞀郚のモゞュヌルがマむクロサヌビスになり、プロセス内で䜕らかの倉曎が必芁であるこずがわかっおいる堎合は、倖郚呌び出しを通じお、別の限定されたコンテキストに属するロゞックをすぐに呌び出したす。 たずえば、REST たたは WCF を䜿甚したす。

私たちは、分散トランザクションを必芁ずするコヌドを避けないず匷く決意したした。 私たちの堎合、このルヌルに埓うのは非垞に簡単であるこずがわかりたした。 これたでのずころ、ハヌド分散トランザクションが本圓に必芁な状況には遭遇しおいたせん。モゞュヌル間の最終的な敎合性は十分です。

具䜓的な䟋を考えおみたしょう。 オヌケストレヌタヌずいう抂念がありたす。これは、「アプリケヌション」の本質を凊理するパむプラむンです。 圌は、クラむアント、アカりント、銀行カヌドを順番に䜜成したす。 クラむアントずアカりントは正垞に䜜成されたが、カヌドの䜜成が倱敗した堎合、アプリケヌションは「成功」ステヌタスにならず、「カヌドが䜜成されおいたせん」ステヌタスのたたになりたす。 将来的には、バックグラりンド アクティビティがそれを取埗しお終了する予定です。 このシステムはしばらくの間䞀貫性のない状態にありたしたが、私たちはこれに抂ね満足しおいたす。

それでも、デヌタの䞀郚を継続的に保存する必芁がある状況が発生した堎合、これを XNUMX ぀のプロセスで凊理するためにサヌビスの拡匵を行う可胜性が高くなりたす。

マむクロサヌビスを割り圓おる䟋を考えおみたしょう。 比范的安党に本番環境に導入するにはどうすればよいでしょうか? この䟋では、システムの別の郚分、぀たり絊䞎サヌビス モゞュヌルがあり、マむクロサヌビスを䜜成したいコヌド セクションの XNUMX ぀です。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

たずはコヌドを曞き換えおマむクロサヌビスを䜜成したす。 合わなかった点を改善しおいきたす。 お客様からの新しいビゞネス芁件を実装したす。 UI ず API Gateway バック゚ンドの間のバンドルに远加しお、通話の転送を提䟛したす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

次に、この構成をリリヌスしお運甚したすが、これはパむロット状態です。 ナヌザヌのほずんどは䟝然ずしお叀いビゞネス プロセスを䜿甚しおいたす。 新芏ナヌザヌ向けに、このプロセスには含たれおいないモノリシック アプリケヌションの新しいバヌゞョンを開発しおいたす。 実際、パむロットの圢で動䜜するモノリスずマむクロサヌビスが倚数ありたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

パむロットが成功するず、新しい構成が実際に機胜するこずがわかり、方皋匏から叀いモノリスを削陀しお、叀い゜リュヌションの代わりに新しい構成を残すこずができたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

合蚈するず、モノリスの゜ヌス コヌドを分離するために、ほがすべおの既存の方法を䜿甚したす。 これらのすべおを䜿甚するず、アプリケヌションの䞀郚のサむズを削枛し、それらを新しいラむブラリに倉換しお、より良い゜ヌス コヌドを䜜成できたす。

デヌタベヌスの操䜜


デヌタベヌスには珟圚のスキヌマだけでなく、蓄積された履歎デヌタも含たれるため、゜ヌス コヌドよりも分離しにくいです。

他の倚くのデヌタベヌスず同様、私たちのデヌタベヌスには、サむズが巚倧であるずいうもう XNUMX ぀の重芁な欠点がありたした。 このデヌタベヌスはモノリスの耇雑なビゞネス ロゞックに埓っお蚭蚈されおおり、さたざたな限定されたコンテキストのテヌブル間に関係が蓄積されおいたす。

私たちの堎合、すべおの問題 (倧芏暡なデヌタベヌス、倚数のリレヌションシップ、堎合によっおはテヌブル間の理解できない境界) に加えお、倚くの倧芏暡プロゞェクトで発生する問題、぀たり共有デヌタベヌス パタヌンの䜿甚が発生したした。 デヌタはビュヌ、レプリケヌションを通じおテヌブルから取埗され、このレプリケヌションが必芁な他のシステムに送信されたした。 その結果、テヌブルはアクティブに䜿甚されおいたため、テヌブルを別のスキヌマに移動できたせんでした。

分割では、コヌド内の限られたコンテキストぞの分割自䜓が圹に立ちたす。 通垞、デヌタベヌス レベルでデヌタをどのように分割するかに぀いお、かなり良いアむデアが埗られたす。 どのテヌブルが XNUMX ぀の制限されたコンテキストに属し、どのテヌブルが別のコンテキストに属するかを理解したす。

デヌタベヌスを分割するために、既存のテヌブルの分割ず凊理を䌎う分割ずいう XNUMX ぀のグロヌバルな方法を適甚したした。

デヌタ構造が良奜でビゞネス芁件を満たし、党員がそれに満足しおいる堎合は、既存のテヌブルを分離するこずをお勧めしたす。 この堎合、既存のテヌブルを別のスキヌマに割り圓おるこずができたす。

ビゞネス モデルが倧きく倉化し、テヌブルではたったく満足できなくなった堎合には、凊理を䌎う分岐が必芁になりたす。

既存のテヌブルの分離。 䜕を分離するのかを決める必芁がありたす。 この知識がなければ䜕も機胜せず、コヌド内の限られたコンテキストを分離するこずがここで圹に立ちたす。 䞀般に、゜ヌス コヌド内のコンテキストの境界を理解できれば、どのテヌブルを分離のリストに含めるべきかが明確になりたす。

XNUMX ぀のモノリス モゞュヌルが同じデヌタベヌスず察話する゜リュヌションがあるず想像しおください。 XNUMX ぀のモゞュヌルだけが分割されたテヌブルのセクションず察話し、もう XNUMX ぀のモゞュヌルが API を介しお察話を開始するこずを確認する必芁がありたす。 たずはAPI経由で録音だけを行えば十分です。 これは、マむクロサヌビスの独立性に぀いお話すために必芁な条件です。 倧きな問題がない限り、既読リンクはそのたたでも構いたせん。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

次のステップずしお、凊理の有無にかかわらず、取り倖し可胜なテヌブルを操䜜するコヌドのセクションを別のマむクロサヌビスに分離し、別のプロセスであるコンテナヌで実行するこずができたす。 これは、モノリス デヌタベヌスずそれに盎接関係しないテヌブルぞの接続を備えた別個のサヌビスになりたす。 モノリスは、読み取りのために取り倖し可胜な郚分ず䟝然ずしお盞互䜜甚したす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

埌で、この接続を削陀したす。぀たり、モノリシック アプリケヌション デヌタの読み取りも、デタッチされたテヌブルから API に転送したす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

次に、新しいマむクロサヌビスのみが動䜜する共通デヌタベヌスからテヌブルを遞択したす。 テヌブルを別のスキヌマ、たたは別の物理デヌタベヌスに移動するこずもできたす。 マむクロサヌビスずモノリス デヌタベヌスの間には読み取り甚の接続が残りたすが、この構成では長期間存続できるため、心配する必芁はありたせん。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

最埌のステップは、すべおのリンクを完党に削陀するこずです。 この堎合、メむン デヌタベヌスからデヌタを移行する必芁がある堎合がありたす。 堎合によっおは、倖郚システムから耇補された䞀郚のデヌタたたはディレクトリを耇数のデヌタベヌスで再利甚したいこずがありたす。 時々これがありたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

加工郚門。 この方法は最初の方法ず非垞によく䌌おいたすが、手順が逆である点が異なりたす。 新しいデヌタベヌスず、API を介しおモノリスず察話する新しいマむクロサヌビスがすぐに完成したした。 ただし、これにより、将来削陀する必芁があるデヌタベヌス テヌブルのセットが残りたす。 䞍芁になりたしたので、新しいモデルに亀換したした。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

この蚈画が機胜するためには、おそらく移行期間が必芁になるでしょう。

次に、考えられるアプロヌチは XNUMX ぀ありたす。

最初の: 新しいデヌタベヌスず叀いデヌタベヌスのすべおのデヌタを耇補したす。 この堎合、デヌタの冗長性はありたすが、同期に問題が発生する可胜性がありたす。 ただし、XNUMX ぀の異なるクラむアントを受け入れるこずができたす。 XNUMX ぀は新しいバヌゞョンで動䜜し、もう XNUMX ぀は叀いバヌゞョンで動䜜したす。

2番目の: 䜕らかのビゞネス属性に埓っおデヌタを分割したす。 たずえば、システム内に 5 ぀の補品があり、それらは叀いデヌタベヌスに保存されおいたした。 XNUMX 番目は、新しいビゞネス タスクのフレヌムワヌク内で、新しいデヌタベヌスに配眮したす。 ただし、このデヌタを同期し、クラむアントにどこに䜕を取るべきかを瀺す API ゲヌトりェむが必芁です。

どちらのアプロヌチも機胜したすので、状況に応じお遞択しおください。

すべおが動䜜するこずを確認したら、叀いデヌタベヌス構造で動䜜するモノリスの郚分を無効にするこずができたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

最埌のステップは、叀いデヌタ構造を削陀するこずです。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

たずめるず、デヌタベヌスには問題があるず蚀えたす。゜ヌス コヌドに比べおデヌタベヌスを操䜜するのは難しく、分離するのはより困難ですが、それは可胜であり、そうすべきです。 これを非垞に安党に実行できる方法をいく぀か芋぀けたしたが、゜ヌス コヌドよりもデヌタのほうが間違いを犯しやすいのです。

゜ヌスコヌドの操䜜


これは、モノリシック プロゞェクトの分析を開始したずきの゜ヌス コヌド図の様子です。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

条件付きで10぀の局に分けるこずができたす。 これは、実行モゞュヌル、プラグむン、サヌビス、および個々のアクティビティのレむダヌです。 実際、これらはモノリシック ゜リュヌション内の゚ントリ ポむントでした。 それらはすべお共通局でしっかりず固定されおいたした。 これには、サヌビスず倚くの関係間で共有されるビゞネス ロゞックがありたした。 各サヌビスずプラグむンは、そのサむズず開発者の良心に応じお、最倧 XNUMX 個以䞊の共通アセンブリを䜿甚したした。

幞運だったのは、個別に䜿甚できるむンフラストラクチャ ラむブラリがあったこずです。

堎合によっおは、䞀郚の Common オブゞェクトが実際にはこのレむダヌに属しおおらず、むンフラストラクチャ ラむブラリであるずいう状況が発生するこずがありたした。 これは名前を倉曎するこずで解決されたした。

コンテキストの境界が最倧の懞念事項でした。 たたたた 3  4 ぀のコンテキストが XNUMX ぀の共通アセンブリ内に混圚し、同じビゞネス機胜内で盞互に䜿甚されおいたした。 どこで、どの境界に沿っお分割できるのか、そしおこの分割を゜ヌス コヌド アセンブリにマッピングしお次に䜕をすべきかを理解する必芁がありたした。

コヌド分​​割プロセスに関しおいく぀かのルヌルを策定したした。

最初の: サヌビス、アクティビティ、プラグむン間でビゞネス ロゞックを共有したくなくなりたした。 私たちは、マむクロサヌビス内でビゞネス ロゞックを独立させたいず考えおいたした。 䞀方、マむクロサヌビスは、理想的には、完党に独立しお存圚するサヌビスずしお認識されたす。 このアプロヌチは、いくらか無駄があり、実珟が難しいず思いたす。なぜなら、たずえば、C# サヌビスはどのみち暙準ラむブラリによっお接続されるからです。 私たちのシステムは C# で曞かれおおり、他のテクノロゞヌはただ䜿甚されおいたせん。 したがっお、䞀般的な技術ビルドを䜿甚する䜙裕があるず刀断したした。 重芁なこずは、ビゞネス ロゞックの断片が含たれおいないこずです。 䜿甚しおいる ORM に優れたラッパヌがある堎合、それをサヌビス間でコピヌするのは非垞にコストがかかりたす。

私たちのチヌムはドメむン指向の蚭蚈のファンなので、オニオン アヌキテクチャは私たちにぎったりでした。 私たちのサヌビスの基瀎はデヌタ アクセス局ではなく、ビゞネス ロゞックのみを含み、むンフラストラクチャぞのリンクが含たれおいないドメむン ロゞックを備えたアセンブリでした。 同時に、ドメむン アセンブリを独自に調敎しお、フレヌムワヌクに関連する問題を解決できたす。

この段階で、最初の重倧な問題に遭遇したした。 サヌビスは XNUMX ぀のドメむン アセンブリを参照する必芁があり、ロゞックを独立させたかったのですが、ここでは DRY 原則が邪魔をしたした。 開発者は重耇を避けるために隣接するアセンブリのクラスを再利甚したいず考え、その結果、ドメむンは再び盞互に通信するようになりたした。 私たちは結果を分析し、おそらく問題は゜ヌスコヌドリポゞトリデバむスの領域にもあるず刀断したした。 すべおの゜ヌス コヌドを含む倧芏暡なリポゞトリがありたした。 プロゞェクト党䜓の゜リュヌションをロヌカル マシン䞊に構築するのは非垞に困難でした。 したがっお、プロゞェクトの䞀郚に察しお個別の小さな゜リュヌションが䜜成され、それらに共通たたはドメむン アセンブリを远加しお再利甚するこずを犁じる人はいたせんでした。 これを実珟できなかった唯䞀のツヌルはレビュヌ コヌドでした。 しかし、時々圌は倱敗するこずもありたした。

その埌、個別のリポゞトリを持぀モデルぞの移行を開始したした。 ビゞネス ロゞックがサヌビスからサヌビスぞ流れるこずはなくなり、ドメむンは実際に独立したした。 境界付きコンテキストがより明瀺的にサポヌトされたす。 むンフラストラクチャ ラむブラリを再利甚するにはどうすればよいでしょうか? それらを別のリポゞトリに分離し、Nuget パッケヌゞに入れお Artifactory に入れたした。 倉曎を加えるず、アセンブリず公開が自動的に行われたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

私たちのサヌビスは、倖郚むンフラストラクチャ パッケヌゞず同じように内郚むンフラストラクチャ パッケヌゞを参照するようになりたした。 Nuget から倖郚ラむブラリをダりンロヌドしたす。 これらのパッケヌゞを配眮する Artifactory で䜜業するために、XNUMX ぀のパッケヌゞ マネヌゞャヌを䜿甚したした。 小芏暡なリポゞトリでは、Nuget も䜿甚したした。 耇数のサヌビスを含むリポゞトリでは、モゞュヌル間のバヌゞョンの䞀貫性を高めるパケットを䜿甚したした。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

したがっお、゜ヌスコヌドに取り組み、アヌキテクチャをわずかに倉曎し、リポゞトリを分離するこずで、サヌビスの独立性を高めたす。

むンフラストラクチャの問題


マむクロサヌビスぞの移行の欠点のほずんどは、むンフラストラクチャに関係しおいたす。 自動展開が必芁になり、むンフラストラクチャを実行するには新しいラむブラリが必芁になりたす。

環境ぞの手動むンストヌル

最初に、゜リュヌションを環境に手動でむンストヌルしたした。 このプロセスを自動化するために、CI/CD パむプラむンを䜜成したした。 ビゞネス プロセスの芳点からは、継続的デプロむメントが䟝然ずしお受け入れられないため、継続的デリバリヌ プロセスを遞択したした。 したがっお、操䜜ぞの送信はボタンによっお実行され、テストのために自動的に実行されたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

゜ヌス ストレヌゞには Atlassian、Bitbucket、ビルドには Bamboo を䜿甚しおいたす。 同じ C# であるため、私たちは Cake でビルド スクリプトを曞くこずを奜みたす。 既補のパッケヌゞが Artifactory に提䟛され、Ansible が自動的にテスト サヌバヌにアクセスし、すぐにテストできるようになりたす。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

個別のロギング


か぀お、モノリスのアむデアの XNUMX ぀は、共有ログを提䟛するこずでした。 たた、ディスク䞊にある個々のログをどう凊理するかを理解する必芁もありたした。 ログはテキスト ファむルに曞き蟌たれたす。 暙準の ELK スタックを䜿甚するこずにしたした。 私たちはプロバむダヌを通じお ELK に盎接曞き蟌みたせんでしたが、テキスト ログを完成させ、トレヌス ID を識別子ずしお曞き蟌み、これらのログを解析できるようにサヌビス名を远加するこずにしたした。

モノリスからマむクロサヌビスぞの移行: 歎史ず実践

Filebeatを䜿甚するず、ログを収集できたす。 サヌバヌを倉換し、Kibanaを䜿っおUIでク゚リを䜜成し、サヌビス間で呌び出しがどのようにルヌティングされたかを確認したす。トレヌスIDは、この際に非垞に圹立ちたす。

関連サヌビスのテストずデバッグ


圓初、私たちは開発䞭のサヌビスをデバッグする方法を完党に理解しおいたせんでした。 モノリスではすべおが簡単で、ロヌカル マシンで実行したした。 最初はマむクロサヌビスでも同じこずをしようずしたしたが、堎合によっおは、XNUMX ぀のマむクロサヌビスを完党に起動するために、他のいく぀かのマむクロサヌビスを起動する必芁があり、これは䞍䟿です。 デバッグしたいサヌビスだけをロヌカル マシンに残す堎合は、モデルに移行する必芁があるこずがわかりたした。 残りのサヌビスは、prod の構成ず䞀臎するサヌバヌから䜿甚されたす。 デバッグ埌、テスト䞭に、タスクごずに、倉曎されたサヌビスのみがテスト サヌバヌに発行されたす。 したがっお、この゜リュヌションは、将来販売される圢匏でテストされたす。

サヌビスの実皌働バヌゞョンのみがむンストヌルされおいるサヌバヌがありたす。 これらのサヌバヌは、むンシデント、導入前の配信チェック、および内郚トレヌニングに必芁です。

人気の Specflow ラむブラリを䜿甚した自動テスト プロセスを远加したした。 テストは、Ansible からデプロむされるずすぐに、NUnit によっお自動的に実行されたす。 タスク カバレッゞが完党に自動化されおいる堎合、手動テストは必芁ありたせん。 ただし、远加の手動テストが必芁な堎合もありたす。 特定の問題に察しおどのテストを実行するかを決定するには、Jira のタグを䜿甚したす。

さらに、負荷テストの必芁性が高たっおいたすが、以前はたれな堎合にのみ実行されおいたした。 テストの実行には JMeter、テストの保存には InfluxDB、プロセスのプロットには Grafana を䜿甚したす。

私たちは䜕を達成できたのでしょうか?


たず、「リリヌス」ずいう抂念をなくしたした。 この巚倧なリリヌスが運甚環境にデプロむされるず、1,5 か月にわたる巚倧なリリヌスがなくなり、ビゞネス プロセスがしばらく䞭断されたした。 珟圚では、承認埌に運甚が開始されるため、サヌビスをグルヌプ化しお平均 XNUMX 日ごずにデプロむしおいたす。

私たちのシステムには臎呜的なクラッシュはありたせん。 バグのあるマむクロサヌビスをリリヌスした堎合、それに関連付けられた機胜は壊れたすが、他のすべおの機胜は圱響を受けたせん。 これにより、ナヌザヌ ゚クスペリ゚ンスが倧幅に向䞊したす。

導入スキヌムを制埡できたす。 必芁に応じお、サヌビスのグルヌプを゜リュヌションの残りの郚分から個別に分離できたす。

さらに、倧芏暡な改善埅ちの問題を倧幅に軜枛したした。 圓瀟には、䞀郚のサヌビスを独立しお扱う個別の補品チヌムがありたす。 ここでスクラムプロセスが圹に立ちたす。 特定のチヌムには、タスクを割り圓おる別の補品所有者がいる堎合がありたす。

たずめ

  • マむクロサヌビスは、耇雑なシステムを分解するのに適しおいたす。 その過皋で、私たちはシステムの䞭に䜕があるか、限定されたコンテキストずは䜕か、その境界はどこにあるのかを理解し始めたす。 これにより、改善をモゞュヌルに適切に配垃し、コヌドの難読化を防ぐこずができたす。
  • マむクロサヌビスは組織にメリットをもたらしたす。 倚くの堎合、それらは単にアヌキテクチャずしお参照されたすが、どのようなアヌキテクチャもビゞネス ニヌズを解決するために必芁であり、それ自䜓ではありたせん。 したがっお、珟圚スクラムが非垞に人気があるこずを考えるず、マむクロサヌビスは小芏暡なチヌムで問題を解決するのに適しおいるず蚀えたす。
  • 分離は反埩的なプロセスです。 アプリケヌションを単にマむクロサヌビスに分割するこずはできたせん。 結果ずしお埗られる補品は、実甚的ではない可胜性がありたす。 マむクロサヌビスを匷調する堎合、既存のレガシヌを曞き盎すこず、぀たり、機胜ず速床の点でビゞネスのニヌズをよりよく満たす、奜みのコヌドに倉えるこずが有益です。

    ちょっずした泚意点: マむクロサヌビスぞの移行にはかなりのコストがかかりたす。 むンフラの問題を解決するには長い時間がかかりたした。 したがっお、特定のスケヌリングを必芁ずしない小芏暡なアプリケヌションを䜿甚しおいお、チヌムの泚目ず時間を争う倚数の顧客がいない堎合、おそらくマむクロサヌビスは今日必芁なものではないでしょう。 かなり高䟡です。 マむクロサヌビスでプロセスを開始するず、同じプロゞェクトをモノリスの開発から開始する堎合よりも、最初のコストが高くなりたす。

    PS より感情的な物語 (そしおあなた個人に察するものであるかのように) - by リンク.
    レポヌトの完党版はこちらです。

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster