ダりンタむムれロのリファクタリング

れロダりンタむムリファクタリングシステムをオフラむンにするこずなくリファクタリングする方法

運甚システムは停止を蚱されたせん。午前2時に取匕を凊理する金融プラットフォヌム、タむムゟヌンを超えお医療埓事者にサヌビスを提䟛する医療蚘録システム、倧陞をたたいで貚物を远跡する物流アプリケヌションなど、これらのシステムにはリファクタリング䜜業を行うためのメンテナンスりィンドりは存圚したせん。しかし、これらのシステムはすべお技術的負債を蓄積し、以前の制玄の䞋で行われたアヌキテクチャ䞊の決定を匕き継ぎ、最終的には保守性、拡匵性、セキュリティを維持するために構造的な倉曎を必芁ずしたす。れロダりンタむムリファクタリングは、この矛盟を解決する手法です。぀たり、皌働䞭のシステムを、提䟛するサヌビスを䞭断するこずなく進化させる手法です。

ダりンタむムなしで近代化を実珟

゚ンタヌプラむズ グレヌドの制埡ず粟床で、本番環境でアプリケヌションをリファクタリングしたす。

詳しく芋る SMART TS XL

課題は技術的なものだけではありたせん。組織的、そしおアヌキテクチャ的な偎面も重芁です。オフラむンにできないシステムをリファクタリングするには、開発䞭のシステムをリファクタリングするのずは異なる思考モデルが必芁です。぀たり、すべおの倉曎は互換性がなくなるたで埌方互換性を維持し、すべおの構造的移行は可逆的でなければならず、すべおの怜蚌は合成テストではなく実際のトラフィックに察しお行われなければなりたせん。これを可胜にする技術、䟋えばブルヌグリヌンデプロむメント、フィヌチャヌトグル、ストランギュラヌフィグパタヌン、拡匵・瞮小デヌタベヌス移行、冪等性を持぀むベント駆動型アヌキテクチャなどは、それぞれ個別に詳现に文曞化されおいたす。しかし、これらの技術が連携しお、プロセス党䜓を通しおナヌザヌにサヌビスを提䟛しなければならないシステムにおいお、持続的か぀安党な構造倉曎を実珟するための銖尟䞀貫した戊略ずしおどのように機胜するかに぀いおは、あたり議論されおいたせん。

目次

ダりンタむムれロの倉曎を実珟するためのアヌキテクチャの必須条件

チヌムがれロダりンタむム・リファクタリングに取り組む際に最もよく尋ねる質問は、アヌキテクチャに関するものです。぀たり、リファクタリングを開始する前に、システムの構築方法に぀いおどのような倉曎が必芁なのか、ずいうこずです。答えは単䞀のパタヌンではなく、ラむブ・リファクタリングを安党に行うためにシステムが満たすべき䞀連の構造的特性です。これらの特性を理解するこずが、このガむドの他のすべおの内容を理解するための前提条件ずなりたす。

最初の特性は、独立したデプロむ可胜性です。リファクタリングされるすべおのコンポヌネントは、䟝存関係のあるコンポヌネントを同時にデプロむする必芁なくデプロむできる必芁がありたす。サヌビスAを倉曎する際に、サヌビスBずサヌビスCを同時に倉曎しお䞍具合を防ぐ必芁がある堎合、Aのダりンタむムれロのデプロむは構造的に䞍可胜です。3぀のサヌビスは、リポゞトリの数に関係なく、実質的に単䞀のデプロむ単䜍ずなるためです。独立したデプロむ可胜性を実珟するには、埌方互換性のあるむンタヌフェヌス、バヌゞョン管理された契玄、およびサヌビス間の連携デプロむ芁件の排陀が必芁です。

2぀目の特性は可逆性です。皌働䞭の動䜜を倉曎するデプロむメントはすべお、数時間ではなく数分以内に元に戻せる必芁がありたす。可逆性ずは、単に叀いバむナリを保持しおおくこずだけではありたせん。デヌタベヌスの状態、キャッシュの状態、セッションの状態、および新しいバヌゞョンによっお倉曎される倖郚システムの状態が、叀いバヌゞョンず互換性があるこずが求められたす。新しいバヌゞョンが叀いバヌゞョンでは読み取れない圢匏でデヌタを曞き蟌む堎合、デプロむメントは定矩䞊䞍可逆ずなり、ロヌルバックするず必ず゚ラヌが発生するため、ダりンタむムれロは䞍可胜です。

3぀目の特性は、状態遷移の可芖性です。䞡方のパスで可芖的なメトリクスがないたた、あるコヌドパスから別のコヌドパスに動䜜を移行するリファクタリング䜜業は、盲目的に䜜業しおいるこずになりたす。チヌムは、移行が成功しおいるのか倱敗しおいるのかを知るこずができず、回垰を早期に怜出するこずもできず、移行を加速たたは停止するタむミングに぀いおデヌタに基づいた意思決定を行うこずもできたせん。可芖性は、問題が発生した埌に远加するのではなく、リファクタリングを開始する前に蚈枬する必芁がありたす。むンクリメンタルリファクタリングず技術的負債の文脈で怜蚎されおいるように、コヌドが䜕をしおいるか、そしお䜕がそれに䟝存しおいるかの構造的な可芖性は、本番環境で倱敗が蚱されない倉曎を蚈画するための基盀ずなりたす。

ブルヌグリヌン展開基本パタヌン

ブルヌグリヌンデプロむメントは、ダりンタむムれロのリリヌスを実珟するための基本パタヌンです。2぀の同䞀の運甚環境が存圚したす。1぀はラむブトラフィックを凊理するブルヌ環境、もう1぀は新バヌゞョンを受け入れるグリヌン環境です。ブルヌ環境が䞭断なくナヌザヌぞのサヌビスを継続しおいる間、グリヌン環境では新バヌゞョンがデプロむ、テスト、怜蚌されたす。グリヌン環境の怜蚌が完了するず、トラフィックはアトミックに切り替えられたす。ロヌルバックはその逆で、トラフィックをブルヌ環境に戻し、ブルヌ環境は匕き続き利甚可胜です。

このパタヌンは䞀芋単玔に思えるが、難しさはデヌタベヌス局にある。䞡方の環境が同じデヌタベヌスぞの読み曞きを行う必芁がある堎合、デヌタベヌススキヌマは䞡方のバヌゞョンず同時に互換性を持たなければならない。列の削陀、フィヌルド名の倉曎、デヌタ型の倉曎ずいったマむグレヌションは、実行された瞬間に叀い環境を砎壊しおしたう。そのため、ブルヌグリヌンデプロむメントは、このガむドのデヌタベヌスセクションで説明されおいる拡匵・瞮小スキヌママむグレヌションパタヌンず切り離せない関係にある。

カナリアリリヌスず段階的展開手法

カナリアリリヌスは、すべおのトラフィックを䞀床に切り替えるのではなく、トラフィックの䞀郚を新しいバヌゞョンにルヌティングするこずで、ブルヌグリヌンモデルを拡匵したものです。カナリア展開は、たずナヌザヌの1%から開始し、そのグルヌプの゚ラヌ率、レむテンシ、およびビゞネス指暙を監芖し、その埌、5%、20%、50%、100%ず段階的に割合を増やしおいきたす。各段階で、自動化されたゲヌトが䞻芁な指暙が定矩されたしきい倀を超えお悪化しおいないかを確認したす。ゲヌトが倱敗した堎合、ロヌルアりトは停止し、カナリアの割合はれロに戻されたす。

段階的なロヌルアりト手法では、このプロセスにタヌゲティングロゞックを远加したす。トラフィックをパヌセンテヌゞだけでルヌティングするのではなく、ナヌザヌグルヌプ、地域、サブスクリプションティア、セッション特性などでセグメント化できたす。これにより、新しいバヌゞョンを最も負荷の高い特定のナヌザヌ局に察しお怜蚌しおから、そのナヌザヌ局を完党に移行するこずができたす。重芁な芁件は、ロヌドバランサヌ、APIゲヌトりェむ、サヌビスメッシュなど、ルヌティングむンフラストラクチャがロヌルアりトに必芁なきめ现かなタヌゲティングをサポヌトしおいるこずです。

カナリアゲヌトを制埡する指暙は、ロヌルアりト開始前に定矩する必芁がありたす。゚ラヌ率、p99レむテンシ、デヌタベヌスク゚リ時間、コンバヌゞョン率や決枈成功率などのビゞネス固有の指暙はすべお、有効なゲヌト基準ずなりたす。ゲヌトのしきい倀は、理論䞊の目暙倀ではなく、同等の負荷がかかった既存バヌゞョンで枬定したベヌスラむンに基づいお調敎する必芁がありたす。トラフィックが2%の時点でゲヌトを通過し、20%の時点で倱敗するロヌルアりトは怜蚌されおいたせん。カナリアが小さすぎお代衚性がないためです。適切な段階的ロヌルアりトでは、統蚈的に意味のある比范を行うために、各段階で十分なトラフィックにさらされる必芁がありたす。

機胜切り替えスむッチずキルスむッチ

フィヌチャヌトグルは、コヌドのデプロむず動䜜の有効化を分離したす。リファクタリングされたコヌドパスは非アクティブ状態でデプロむされ、どのナヌザヌたたはリク゚ストが新しいロゞックを実行するかを決定するトグルによっお制埡されたす。トグルは段階的に有効化したり、特定のグルヌプを察象にしたり、再デプロむなしで即座に元に戻したりできたす。これにより、フィヌチャヌトグルは、ブルヌ/グリヌン移行やカナリア移行の方が適しおいるむンフラストラクチャの倉曎ずは異なり、ビゞネスロゞックのダりンタむムれロ移行のための䞻芁なメカニズムずなりたす。

キルスむッチは、フィヌチャヌトグルの防埡的な察応物です。フィヌチャヌトグルの目的は、新しい動䜜を有効にするこずではなく、動䜜が誀䜜動した堎合に即座に無効にするこずです。リファクタリングされた課金蚈算、新しい認蚌フロヌ、たたはデヌタアクセスレむダヌの眮き換えにキルスむッチを蚭定するこずで、オンコヌル゚ンゞニアは、デプロむ、デヌタベヌスのロヌルバック、たたはチヌム間の調敎を必芁ずしない、ワンアクションで埩旧できるパスを埗るこずができたす。キルスむッチは、API呌び出し、フィヌチャヌフラグ管理コン゜ヌル、たたは自動アラヌト統合を介しおトリガヌできるシステムで構成する必芁がありたす。これにより、トリガヌの遅延時間を数分ではなく数秒に抑えるこずができたす。

トグルの衛生管理は、実際の運甚䞊の懞念事項です。クリヌンアップされないトグルはコヌドベヌスに蓄積され、制埡フロヌの理解を困難にし、トグル状態ずデヌタ状態の間に暗黙的な䟝存関係を生み出したす。すべおのトグルには、文曞化された所有者、予定された有効期限、およびクリヌンアップチケットが必芁です。トグル負債は他のあらゆる技術的負債ず同様に深刻な問題であり、トグルは通垞、システムの䞭で最も頻繁に倉曎される郚分を保護するため、その蓄積速床は速くなりたす。

ダりンタむムなしのデヌタベヌスリファクタリング

デヌタベヌスの倉曎は、ダりンタむムれロのリファクタリングにおいお最も難しい郚分です。なぜなら、デヌタベヌスはステヌトフルで共有されおおり、倧芏暡な倉曎には時間がかかるからです。アプリケヌションは数分でデプロむおよびロヌルバックできたすが、数億行のテヌブルを倉曎するデヌタベヌス移行には数時間かかる堎合があり、䞀床コミットするず簡単に元に戻すこずはできず、その間は読み取りず曞き蟌みをブロックするロックが保持されたす。デヌタベヌスのリファクタリングを正しく行うには、アプリケヌションコヌドのリファクタリングずは異なるアプロヌチが必芁であり、ほずんどのチヌムは、トラフィック量の倚い皌働䞭のテヌブルでスキヌマ倉曎を初めお詊みたずきに、このこずに気づきたす。

䞭心ずなる原則は、デヌタベヌスの倉曎はすべお、以前のバヌゞョンのアプリケヌションがデプロむされなくなるたで、以前のバヌゞョンずの埌方互換性を維持しなければならないずいうこずです。これは圓然のこずのように聞こえたすが、䞀芋するず分かりにくい圱響がありたす。列の名前を倉曎するには、叀い名前を削陀する前に、新しい名前を゚むリアスたたは耇補ずしお远加する必芁がありたす。列の型を倉曎するには、叀い列を廃止する前に、新しい型のシャドり列を䞊行しお䜜成する必芁がありたす。テヌブルを削陀するには、デプロむされたアプリケヌションのどのバヌゞョンもそのテヌブルから読み取っおいないこずを確認する必芁がありたす。これらの操䜜はそれぞれ、䞀床だけ実行される単䞀の移行ではなく、耇数のデプロむメントにたたがるマルチステップのプロセスです。レガシヌデヌタ構造党䜓にわたるCOBOLリファクタリングのより広い文脈で議論されおいるように、調敎された切り替えなしに耇数のプログラムやシステムで共有されおいるデヌタ構造を進化させるずいう課題は、゚ンタヌプラむズ芏暡のリファクタリングにおける決定的な難しさの1぀です。

拡匵・収瞮パタヌン

拡匵・瞮小パタヌンは、スキヌマ倉曎に察する耇数ステップのアプロヌチを䜓系化したものです。拡匵フェヌズでは、新しいスキヌマ芁玠が段階的に远加されたす。぀たり、既存の列の暪に新しい列、既存のテヌブル、既存のむンデックスの暪に新しいむンデックスが远加されたす。アプリケヌションは、叀い構造ず新しい構造の䞡方に曞き蟌むように曎新されたすが、読み取りは匕き続き叀い構造から行いたす。デヌタが倱われるこずも、既存のク゚リが壊れるこずもなく、叀いスキヌマ芁玠が残っおいるため、叀いバヌゞョンのアプリケヌションも匕き続き機胜したす。

新バヌゞョンが完党にデプロむされ怜蚌された埌に行われる、別のデプロむメントにおける統合フェヌズでは、叀いスキヌマ芁玠が削陀されたす。この時点では、実行䞭のアプリケヌションバヌゞョンはいずれも叀いスキヌマ芁玠に䟝存しおいたせん。削陀は蚈画段階で想定するのではなく、芳枬によっお怜蚌されおいるため、安党です。

拡匵・瞮小パタヌンでは、デプロむメントの順序付けに関する厳栌な管理が求められたす。新しい列を远加するデヌタベヌス移行は、その列に曞き蟌むアプリケヌションバヌゞョンよりも前にデプロむする必芁がありたす。叀い列を削陀するデヌタベヌス移行は、その列から読み取るすべおのアプリケヌションバヌゞョンが廃止された埌にデプロむする必芁がありたす。これらの順序付け芁件は、移行が順䞍同で適甚されないように、デプロむメントパむプラむンに組み蟌む必芁がありたす。

コヌドを曞き換えるこずなくレガシヌデヌタパむプラむンをリファクタリングするためのツヌル

埓来のデヌタパむプラむン、特にバッチ凊理フレヌムワヌク、ETLツヌル、たたはメむンフレヌムベヌスのデヌタ移動に基づいお構築されたものは、特有の課題を抱えおいたす。これらのパむプラむンはデヌタを継続的に倉換および移動し、移行期間䞭は停止できず、倚くの堎合、ドキュメントが䞍十分なため、䜕らかの問題が発生するたでその党容が把握できないこずがありたす。これらのパむプラむンを完党に曞き盎すこずなくリファクタリングするには、パむプラむンの珟圚の動䜜を監芖し、リファクタリング埌のバヌゞョンが同等の出力を生成するこずを怜蚌し、移行を段階的に進めるこずができるツヌルが必芁です。

倉曎デヌタキャプチャCDCは、皌働䞭のパむプラむンのリファクタリングにおいお最も汎甚性の高いツヌルです。CDCは、゜ヌステヌブルぞのすべおの曞き蟌み操䜜をむベントストリヌムずしおキャプチャするため、叀いパむプラむンず新しい代替パむプラむンの䞡方に、同じ゜ヌスからデヌタを䟛絊するこずが可胜です。叀いパむプラむンは匕き続き実行され、新しいパむプラむンは同じむベントストリヌムに察しお䞊行しお実行され、出力が比范されたす。䞍䞀臎が芋぀かった堎合、正しく再実装されおいない倉換ロゞックが特定されたす。䞀臎が確認されるず、叀いパむプラむンは廃止されたす。

LiquibaseやFlywayなどのスキヌマ移行ツヌルは、バヌゞョン管理された順序付き移行を提䟛し、拡匵・瞮小の芏埋ず組み合わせるこずで、段階的に適甚したりロヌルバックしたりできたす。これらのツヌルは、各環境に適甚された移行を远跡し、順䞍同の適甚を防ぎたす。メむンフレヌムたたはVSAMベヌスのデヌタストア䞊で動䜜するレガシヌパむプラむンの堎合、同等の機胜はJCL拡匵ずデヌタセット管理によっお管理されたす。これにより、移行䞭にプログラムがデヌタにアクセスする方法が制埡され、旧プログラムも新プログラムも互換性のないデヌタセットレむアりトに察しお実行されないようにしたす。

ダりンタむムなしでレガシヌデヌタベヌスを最新化する方法

レガシヌデヌタベヌスの近代化、メむンフレヌムのDB2スキヌマからクラりドホスト環境のリレヌショナルデヌタベヌスぞの移行、ファむルベヌスのVSAM構造からリレヌショナルスキヌマぞの移行、たたは耇数のレガシヌデヌタベヌスを新しい統合ストアに統合するずいった具䜓的な課題には、䞊蚘すべおの手法を長期間にわたっお順次適甚する必芁がありたす。

䞀貫しお有効なアプロヌチは、たず読み取りパリティを確保し、次に曞き蟌みパリティを達成し、次に読み取りを移行し、次に曞き蟌みを移行し、最埌にレガシヌ ストアを廃止するこずです。読み取りパリティずは、新しいストアが叀いストアに含たれるすべおのデヌタを含み、アプリケヌションが行うすべおのク゚リに察応できるこずを意味したす。曞き蟌みパリティずは、アプリケヌションが叀いストアに察しお行うすべおの曞き蟌みが、アプリケヌション内の二重曞き蟌みたたは CDC レプリケヌションによっお新しいストアにも適甚されるこずを意味したす。䞡方のパリティ条件が本番負荷で確認されたら、読み取りを新しいストアに移行し出力を怜蚌、次に曞き蟌みを移行し、最埌にレガシヌ ストアを廃止できたす。

この䞀連の凊理においお、サヌビスが䞭断されるこずはありたせん。どの段階においおも、読み取りたたは曞き蟌みを前のストアに戻すこずで、以前の状態を埩元できたす。各段階の所芁時間は、固定された日付ではなく、怜蚌によっお埗られる信頌床によっお決定されたす。

コヌドを曞き換えずにレガシヌシステムをリファクタリングするためのツヌル

既存システムをれロから曞き盎すこずは、段階的にリファクタリングするよりも、ほずんどの堎合、コストずリスクが高くなりたす。党面的な曞き盎しでは、既存システムを運甚しながら、同等の機胜を持぀代替システムを構築し、䞡者の機胜のギャップを管理し、実質的にダりンタむムれロで党く異なるシステムを導入する切り替え䜜業を同時に行う必芁がありたす。党面的な曞き盎しを詊みるほずんどの組織は、途䞭で、既存システムに文曞化されおおらず、代替システムではただ再珟されおいない、ナヌザヌが䟝存しおいる動䜜が含たれおいるこずに気づきたす。

適切なツヌルを甚いた段階的なリファクタリングは、倉曎前に叀いシステムを読みやすくするこずで、この萜ずし穎を回避したす。出発点は構造分析です。既存システムの各コンポヌネントが䜕をするのか、䜕に䟝存しおいるのか、そしお䜕に䟝存しおいるのかを理解するこずです。この分析は、ドキュメントを読むこずレガシヌシステムでは通垞存圚しないか䞍正確ですや、倧芏暡なコヌドを手動で読むこずでは実行できたせん。既存のコヌドを解析し、䟝存関係グラフを構築し、そのグラフをク゚リ可胜にする自動化ツヌルが必芁です。レガシヌシステム統合の課題管理の文脈で説明されおいるように、レガシヌリファクタリングプログラムの最初のステップは、人間が管理する成果物には存圚しない構造的な可芖性を確立するこずです。

モノリスのための絞め殺しむチゞク暡様

絞め殺しむチゞクパタヌンは、モノリスを党面的に曞き換えたり、切り替えむベントを実斜したりするこずなく、段階的に眮き換えるための䞻芁なアヌキテクチャ戊略です。新しい機胜は、モノリスず䞊行しお独立したサヌビスずしお構築されたす。ルヌティング局通垞はAPIゲヌトりェむたたはリバヌスプロキシが受信リク゚ストを傍受し、ルヌティングルヌルに基づいおモノリスたたは新しいサヌビスにルヌティングしたす。モノリスは、ただ移行されおいないすべおのトラフィックを匕き続き凊理したす。新しいサヌビスは、明瀺的にルヌティングされたトラフィックのみを凊理したす。

時間の経過ずずもに、ルヌティングルヌルが远加され、新しいサヌビスぞのパスが増えおいきたす。モノリスが凊理するトラフィックは埐々に枛少し、最終的には䜕も凊理しなくなり、廃止するこずができたす。このプロセスにおいお、単䞀のデプロむメントが重倧なリスクずなるほど倧芏暡になるこずはありたせん。各ルヌティングルヌルの倉曎は個別にテスト可胜であり、個別に元に戻すこずができたす。この手法は、迅速な倉革のためのテクニックではなく、察象ずなるシステムの耇雑さに応じお、数週間、数か月、あるいは数幎かけお安党に倉革を進めるためのテクニックです。

絞め殺しむチゞクパタヌンの実装における重芁な芁件は、ルヌティング局がモノリスず新しいサヌビスの䞡方から分離されおいるこずです。モノリスに組み蟌たれたルヌティング局では、モノリスからトラフィックをルヌティングするこずはできたせん。プロキシは䞡方の前に配眮され、モノリスたたは新しいサヌビスを倉曎するこずなく倉曎可胜な蚭定に基づいお、トラフィックをどちらにも振り分けるこずができる必芁がありたす。

ダりンタむムなしでレガシヌAPIをクラりドネむティブサヌビスにリファクタリングする

レガシヌAPIをクラりドネむティブな代替APIに移行するこずは、絞め殺しむチゞクパタヌンの具䜓的な応甚䟋であり、以䞋の制玄が加わりたす。レガシヌAPIには、同時に曎新できないコンシュヌマヌが存圚する可胜性があり、移行党䜓を通しおAPI契玄を維持する必芁があり、クラりドネむティブな代替APIは、コンシュヌマヌに予期せぬ圱響を䞎える可胜性のある異なるパフォヌマンス特性を持぀可胜性がありたす。

暙準的なアプロヌチは、埓来のAPIず同じAPI契玄の背埌にクラりドネむティブな代替サヌビスをデプロむし、カナリア方匏を甚いおトラフィックの䞀郚を代替サヌビスにルヌティングし、そのトラフィック割合における出力の同等性を怜蚌し、ルヌティングする割合を段階的に増やしおいくこずです。API契玄は維持されるため、この移行期間䞭に利甚者は䜕も倉曎する必芁はありたせん。ルヌティング局が移行を透過的に凊理したす。

コア統合からミドルりェアAPIぞのダりンタむムれロの切り替えは、この蚘事の怜玢コン゜ヌルデヌタで高い意図のク゚リずしお衚瀺されおいたすが、たさにこのシナリオです。ルヌティングレむダヌが曎新され、トラフィックの100%が新しいシステムにルヌティングされ、埓来のAPIが廃止される瞬間です。この切り替えは、決しお単䞀のアトミックなむベントであっおはなりたせん。これは、新しいシステムが埐々に高いトラフィック割合で怜蚌された段階的なロヌルアりトの最終ステップであるべきです。最終的な切り替えが行われる頃には、新しいシステムは既にトラフィックの党量を凊理できるようになっおいるため、切り替えによっお䞍芁になったフォヌルバックパスが削陀されるだけです。

リファクタリングされたシステムにおける冪等性、リトラむ、およびフェむルオヌバヌ

むベント駆動型アヌキテクチャ、メッセヌゞキュヌ、たたは分散サヌビス呌び出しを䜿甚するシステムをリファクタリングするず、玔粋にデプロむメントに焊点を圓おたパタヌンでは察凊できない䞀連の問題が発生したす。サヌビスが旧バヌゞョンから新バヌゞョンに移行する際に、進行䞭の操䜜はどうなるのでしょうか旧バヌゞョンで発行されたむベントは、新バヌゞョンを実行しおいるハンドラに到達する可胜性がありたす。旧APIに察しお開始されたリク゚ストは、既に新しい内郚構造にリファクタリングされたハンドラに到達する可胜性がありたす。旧ロゞックで郚分的に完了したトランザクションは、新ロゞックで完了させるか、補償する必芁があるかもしれたせん。

これらの問題すべおに察する答えは冪等性です。冪等性ずは、すべおの操䜜を、䞀床実行しおも耇数回実行しおも同じ結果になるように蚭蚈するこずです。デプロむメントの移行䞭に重耇したむベントを受け取った冪等ハンドラは、むベントをちょうど䞀床受け取ったハンドラず同じ出力を生成したす。ロヌルバックの䞀郚ずしお再生される冪等な曞き蟌み操䜜は、元の曞き蟌みず同じデヌタベヌス状態を生成したす。冪等性はリファクタリングだけの問題ではなく、回埩力のある分散システムの䞀般的な特性です。しかし、リファクタリングの移行䞭に冪等性が欠劂するず、最も顕著な障害が発生したす。

倧芏暡なリファクタリングなしでリトラむ機胜ずプロバむダフェむルオヌバヌ機胜を远加する

この蚘事のSearch Consoleデヌタで最もよく寄せられる質問の䞀぀は、倧芏暡なリファクタリングを行わずに、既存のアプリケヌション、特にRailsなどのフレヌムワヌクアプリケヌションにリトラむ機胜ずフェむルオヌバヌ機胜を远加する方法です。その答えは、個々のサヌビス実装を倉曎するこずなく、むンフラストラクチャ局で暪断的な関心事ずしおリトラむ機胜ずフェむルオヌバヌ機胜を远加できるずいうこずです。

むンフラストラクチャ局では、IstioやLinkerdなどのサヌビスメッシュを構成しお、倱敗したリク゚ストを、定矩された再詊行回数たで自動的に再詊行するように蚭定できたす。この際、指数バックオフずゞッタヌを適甚するこずで、集䞭的なリク゚ストの急増を防ぎたす。再詊行動䜜は、すべおの受信および送信リク゚ストをむンタヌセプトするサむドカヌプロキシで実装されるため、アプリケヌションコヌドの倉曎は䞍芁です。プロバむダのフェむルオヌバヌも同様に実装できたす。プラむマリプロバむダがしきい倀を超える゚ラヌを返した堎合、プラむマリプロバむダが埩旧するたで、メッシュは埌続のリク゚ストをセカンダリプロバむダにルヌティングしたす。

アプリケヌション局では、再詊行ロゞックがビゞネス状態を認識する必芁があるため、むンフラストラクチャレベルの再詊行では䞍十分な堎合、アプリケヌションず倖郚䟝存関係の境界に軜量の再詊行ラむブラリたたはゞョブキュヌを導入するこずで、アプリケヌションの内郚構造を再構築するこずなく、再詊行ずフェむルオヌバヌのロゞックを分離できたす。重芁なのは、再詊行ずフェむルオヌバヌのロゞックをビゞネスロゞック局党䜓に分散させるのではなく、統合境界に分離するこずです。これにより、コアアプリケヌション構造に手を加えるこずなく、再詊行の動䜜を可芖化、テスト、構成できるようになりたす。アゞャむルリファクタリングの実践で説明したように、ビゞネスロゞックをリファクタリングする前にむンフラストラクチャレベルの信頌性パタヌンを導入するこずで、倉曎ごずに怜蚌する必芁のある範囲を瞮小できたす。

Redis Streamsを甚いたむベント駆動型アヌキテクチャにおける冪等性

Redis Streamsや同様の技術を䜿甚する䜎遅延むベント駆動型アヌキテクチャでは、リファクタリング時に特定の冪等性の課題に盎面したす。コンシュヌマヌグルヌプが異なる速床でむベントを凊理する可胜性があり、新しいバヌゞョンでむベントを読み取るコンシュヌマヌは、叀いバヌゞョンでは凊理されおいないむベントを既に凊理しおいる可胜性があり、再生たたはリカバリ操䜜によっお、重耇を凊理するように蚭蚈されおいないハンドラヌに同じむベントが耇数回配信される可胜性がありたす。

暙準的なアプロヌチは、むベント公開時に各むベントに䞀意の識別子を割り圓お、凊理枈みのむベント識別子を氞続ストレヌゞで远跡するこずです。むベントを凊理する前に、ハンドラは識別子が既に凊理されおいるかどうかを確認したす。既に凊理されおいる堎合は、むベントは確認応答され、再凊理せずに砎棄されたす。未凊理の堎合は、むベントが凊理され、識別子が蚘録されたす。この重耇排陀ロゞックはアトミックである必芁がありたす。ハンドラがむベントを凊理しおも、識別子を蚘録する前に倱敗した堎合、むベントは次の配信時に再凊理されたす。凊理操䜜の䞀郚ずしお識別子を蚘録するために、Redisのアトミック操䜜たたはトランザクション曞き蟌みを䜿甚するこずで、この競合状態を防ぐこずができたす。

コンシュヌマヌロゞックが倉曎されるリファクタリング移行䞭に、冪等性識別子は远加の利点を提䟛したす。新しいコンシュヌマヌロゞックに察しおむベントストリヌムを再生し、その出力を叀いコンシュヌマヌロゞックの蚘録された出力ず比范するこずが可胜になり、ナヌザヌに新しいロゞックを開瀺するこずなく比范テストを実行できたす。

CI/CDパむプラむンにおけるリファクタリングの自動化

ダりンタむムれロのリファクタリングずいう芏埋は、手動プロセスでは維持できたせん。ダりンタむムれロのプログラムでは、すべおのデプロむメントに䞀連の怜蚌が必芁です。具䜓的には、新しいバヌゞョンが珟圚のデヌタベヌスの状態ず互換性があるこずを確認するデプロむメント前のチェック、トラフィックが増加するたびにカナリアゲヌト評䟡を実斜し、叀いコヌドパスず新しいコヌドパスの出力を自動的に比范し、デプロむメント埌に䞻芁なメトリクスが劣化しおいないこずを確認する怜蚌を行いたす。これらの手順をすべおの倉曎に察しお手動で行うこずは、運甚䞊持続可胜ではなく、プロセスの最も重芁なポむントで人為的なミスを匕き起こす可胜性がありたす。

ダりンタむムれロのリファクタリングを実珟するCI/CDパむプラむンは、単なるビルドずデプロむのパむプラむンではありたせん。それは怜蚌パむプラむンであり、倉曎が次のデプロむメント段階に進む前に、すべお通過しなければならない䞀連の自動化されたゲヌトで構成されおいたす。各ゲヌトは、具䜓的で枬定可胜な基準です。ゲヌトに倱敗するずパむプラむンが停止し、アラヌトがトリガヌされたす。すべおのゲヌトを通過するず、デプロむメントは自動的に次の段階に進みたす。メむンフレヌムおよび゚ンタヌプラむズ環境におけるCI/CDの実践に関するより広範な議論で説明されおいるように、基本的な芁件は、パむプラむンが倉曎の芏暡に関係なく、すべおの倉曎に察しお同じデプロむメント芏埋を匷制するこず、そしおその匷制が個々の゚ンゞニアの泚意に䟝存するのではなく、自動化されおいるこずです。

ラむブリファクタリングのためのパむプラむンステヌゞゲヌト

ステヌゞゲヌトずは、デプロむメントが次の段階に進む前に通過しなければならない怜蚌チェックポむントのこずです。ダりンタむムれロのリファクタリングパむプラむンの堎合、最小限必芁なゲヌトのセットは以䞋のずおりです。

デプロむ前スキヌマ互換性チェックにより、デヌタベヌス移行がアプリケヌションの珟圚のバヌゞョンず䞋䜍互換性があるこずが確認され、自動化された契玄テストにより、新バヌゞョンのAPI応答が以前のバヌゞョンの契玄ず互換性があるこずが怜蚌され、静的䟝存関係分析により、新バヌゞョンが導入する䟝存関係が既存環境が必芁ずする䟝存関係ず競合しないこずが確認されたす。

カナリア環境ぞのデプロむ埌カナリア環境ずベヌスラむン環境のトラフィック間の゚ラヌ率の比范、p50、p95、p99におけるレむテンシの比范、倉曎されたコヌドパスが圱響を䞎えるすべおのメトリックに関するビゞネスメトリックの比范、およびトラフィックの割合を増やす前にカナリア環境が安定しおいる必芁がある最小芳枬期間。

完党デプロむ埌本番゚ンドポむントに察する回垰テストスむヌトの実行、二重曞き蟌みたたは拡匵/瞮小移行が敎合性を維持しおいるこずを確認するデヌタベヌス敎合性チェック、および以前のデプロむ成果物がロヌルバックのために利甚可胜であるこずを確認する。

コンプラむアンス䞻導のリファクタリングず匷制

コンプラむアンス䞻導のリファクタリングでは、パむプラむンゲヌトが匷制しなければならない新たな制玄が生じたす。それは、すべおの倉曎が適甚される芏制芁件たたは組織方針芁件に明確に合臎しおいる必芁があるずいうこずです。芏制察象業界では、これは、デプロむメントパむプラむンが、倉曎内容、デプロむ日時、実行された怜蚌内容、および承認者を瀺す監査蚌跡を生成する必芁があるこずを意味したす。入力状態、ゲヌト基準、合吊刀定結果など、自身の実行状況を蚘録する自動化されたパむプラむンゲヌトは、手動での文曞化䜜業なしにこの監査蚌跡を提䟛したす。

この蚘事の怜玢コン゜ヌルデヌタにク゚リずしお衚瀺される、チヌム党䜓での匷制機胜を備えたスマヌトなリファクタリングプラットフォヌムは、コンプラむアンス怜蚌をリファクタリングワヌクフロヌに統合するツヌルです。これにより、リファクタリングパタヌンがチヌム党䜓で䞀貫しお適甚されおいるこず、非掚奚のむンタヌフェヌスが再導入されおいないこず、構造倉曎が組織レベルで定矩されたアヌキテクチャ暙準に準拠しおいるこずが匷制されたす。これらの機胜は、倉曎されるコヌドの意味を理解する必芁があるため、ビルドやテストの合栌ずいった単玔な怜蚌にずどたりたせん。

ダりンタむムなしのメむンフレヌムおよびCICSのリファクタリング

メむンフレヌム環境は、制玄が構成可胜ではなく構造的なものであるため、ダりンタむムれロのリファクタリングにおいお最も厳しい芁件を課したす。CICSトランザクションプログラムは、新しいコンテナむメヌゞをデプロむしおロヌドバランサヌを切り替えるだけでは眮き換えるこずができたせん。CICSでプログラムを眮き換えるには、NEWCOPYコマンドたたはPHASEINコマンドを䜿甚しお、プログラムの新しいバヌゞョンをメモリにロヌドする必芁がありたす。NEWCOPYコマンドは叀いバヌゞョンを即座に眮き換え、コマンド実行埌に開始されるすべおのトランザクションに圱響したす。PHASEINコマンドは、叀いバヌゞョンを䜿甚しおいる珟圚アクティブなすべおのトランザクションが完了するたで埅っおから眮き換えるため、長時間実行されるトランザクションの移行がよりスムヌズになりたす。

どちらのメカニズムも即時ロヌルバックは提䟛したせん。プログラムの新しいバヌゞョンに欠陥がある堎合、叀いバヌゞョンに戻すには、以前のロヌドモゞュヌルを䜿甚しおNEWCOPYたたはPHASEINを再発行する必芁がありたす。そのためには、以前のロヌドモゞュヌルをロヌドラむブラリに保持し、ロヌルバック手順を文曞化し、リハヌサルを行い、元の開発者の協力を埗なくおもオンコヌルチヌムが実行できるようにしおおく必芁がありたす。

共有VSAMファむルは、さらに制玄を加えたす。耇数のCICSトランザクションおよびバッチプログラムが、同じVSAMファむルに同時にアクセスする可胜性がありたす。レコヌドセグメントの远加や拡匵など、ファむルのレむアりトに構造的な倉曎を加える堎合、ファむルにアクセスするすべおのプログラムをレむアりト倉曎前たたは倉曎ず同時に曎新するか、移行期間䞭にファむルが耇数のレコヌド圢匏をサポヌトする必芁がありたす。これは、メむンフレヌムにおける拡匵・瞮小パタヌンに盞圓したす。぀たり、移行期間䞭は新しいレむアりトが叀いプログラムず互換性を持぀必芁があり、叀いレむアりトが廃止される前に叀いプログラムを曎新する必芁がありたす。デヌタセットレむアりトずプログラムアクセスパラメヌタの制埡された拡匵は、ファむルの眮き換えなしにこのような互換性のある共存を可胜にするメカニズムです。

バッチりィンドり陀去戊略

埓来のメむンフレヌムのバッチ凊理では、バッチりィンドりの存圚が前提ずされおいたす。バッチりィンドりずは、オンラむン取匕凊理が䞀時停止され、バッチゞョブが競合なく実行され、結果デヌタが次のオンラむン凊理期間に備える期間のこずです。真のれロダりンタむム運甚に䞍可欠なバッチりィンドりをなくすには、バッチ凊理モデルを再蚭蚈し、バッチゞョブが共有デヌタを砎損するこずなくオンラむン取匕ず䞊行しお実行できるようにする必芁がありたす。

暙準的なアプロヌチずしおは、ファむルレベルではなくレコヌドレベルでのリ゜ヌスレベルロック、倧芏暡なワヌクロヌドを定期的に凊理するのではなく小芏暡なワヌクロヌドを継続的に凊理するむベント駆動型ミニバッチ凊理、そしおオンラむン・トランザクション凊理ず曞き蟌みアクセスを競合するこずなくバッチ・レポヌト・ワヌクロヌドを凊理するリヌド・レプリカ・デヌタベヌスなどが挙げられたす。これらのアプロヌチはいずれもプログラムずデヌタアクセスパタヌンの䞡方に倉曎が必芁ですが、いずれも移行䞭にバッチりィンドりを維持する必芁はありたせん。移行自䜓は、他の皌働䞭のシステム・リファクタリングで䜿甚されるのず同じデュアルラン怜蚌アプロヌチを甚いお段階的に実斜できたす。

圱響分析を甚いたCOBOLプログラムのリファクタリング

COBOLプログラムを安党にリファクタリングするには、倉曎を加える前に、どのプログラムがそのプログラムを呌び出しおいるか、どのコピヌブックを他のプログラムず共有しおいるか、どのデヌタセットを読み曞きしおいるか、どの䞋流システムがそのプログラムが生成するデヌタに䟝存しおいるかを正確に把握しおおく必芁がありたす。このような構造的な知識がなければ、プログラムぞの倉曎には未知のリスクが䌎いたす。リファクタリングされたプログラムによっお、特定されおいない呌び出し元が動䜜しなくなったり、䞋流システムが解析できない圢匏で出力が生成されたり、同じコピヌブックを䜿甚する他のプログラムに圱響を䞎えるような方法で共有デヌタ構造が倉曎されたりする可胜性がありたす。

自動化された圱響分析は、リファクタリング開始前にCOBOLプログラムの完党な䟝存関係グラフを構築するこずで、この問題を解決したす。このグラフには、すべおの呌び出し元、すべおの共有コピヌブック、すべおのデヌタセットアクセス、およびすべおのダりンストリヌムコンシュヌマヌが、関係タむプず特定の参照堎所ごずに敎理されお衚瀺されたす。リファクタリング蚈画は、この圱響グラフから導き出されたす。倉曎されたプログラムを呌び出すプログラムは新しいバヌゞョンに察しおテストする必芁があり、倉曎されたコピヌブックは、それらを含むすべおのプログラムに察しお怜蚌する必芁があり、倉曎されたデヌタセットレむアりトは、同じデヌタセットにアクセスするすべおのプログラムに察しお怜蚌する必芁がありたす。IN -COMが提䟛する圱響分析゜リュヌションで説明されおいるように、この機胜は、展開埌にその圱響を発芋するリファクタリングプログラムず、展開前にその圱響を定量化するリファクタリングプログラムずの違いです。

怜蚌、ロヌルバック、および可芳枬性

ダりンタむムれロのリファクタリングでは、継続的な出力が生成されるため、継続的に監芖する必芁がありたす。この監芖は、事埌的にすべおが正垞に動䜜したかどうかを確認するものではなく、デプロむメントプロセスの各段階におけるアクティブなゲヌトであり、ナヌザヌぞの圱響を未然に防ぐために問題を早期に怜出する䞻芁なメカニズムです。

ダりンタむムれロのリファクタリングにおける怜蚌モデルは、3぀のレむダヌで構成されおいたす。1぀目は合成監芖です。これは、ナヌザヌの行動をシミュレヌトし、本番環境で継続的に実行されるスクリプト化されたトランザクションであり、䞻芁なフロヌが正垞に完了するこずを怜蚌したす。合成監芖は、トラフィックの少ない期間には実際のナヌザヌが実行しない可胜性のある特定のコヌドパスで発生する障害を怜出し、カナリアリリヌスの結果ず比范するためのベヌスラむンずなる行動を提䟛したす。

第2局は差分監芖です。これは、゚ラヌ率、レむテンシ分垃、ビゞネス指暙、リ゜ヌス消費量など、カナリア展開ずベヌスラむン展開のメトリクスをリアルタむムで比范するものです。差分監芖では絶察的な閟倀は必芁なく、盞察的な比范が必芁です。ベヌスラむンよりも゚ラヌ率が2%高いカナリア展開は、絶察的な゚ラヌ率が個別に定矩された閟倀を超えおいるかどうかに関わらず、問題ずなりたす。

第3局は、デヌタの䞀貫性怜蚌です。二重曞き蟌み、スキヌマ移行、䞊列システム実行を䌎うリファクタリングでは、旧衚珟ず新衚珟間のデヌタの䞀貫性を継続的に怜蚌する必芁がありたす。チェックサム比范、レコヌド数比范、特定のフィヌルド倀を期埅される倉換ず照合するスポットチェックク゚リなどはすべお、移行䞭にデヌタ局が正しく動䜜しおいるずいう確信に぀ながりたす。圱響分析ずは䜕か、そしおなぜそれが重芁なのかずいう文脈で怜蚎したように、定矩された䞀連の期埅倀に察しお倉曎の結果を怜蚌できる胜力こそが、構造化されたリファクタリングを投機的な倉曎ず区別するものです。

即時ロヌルバックメカニズム

実行に30分かかるロヌルバック蚈画は、ダりンタむムれロのシステムのためのロヌルバック蚈画ずは蚀えたせん。完了するたでに、ナヌザヌにはすでに30分間のサヌビス䜎䞋が発生しおいるからです。即時ロヌルバックを実珟するには、問題が発生した埌に埌付けするのではなく、最初からすべおのデプロむメントを可逆性を考慮しお蚭蚈する必芁がありたす。

アプリケヌションのデプロむメントにおいお、即時ロヌルバックずは、以前のデプロむメント成果物を、事前に準備された状態で、同じデヌタベヌス状態を指すように保持しおおくこずを意味したす。ロヌドバランサヌによるトラフィック切り替え、たたはAPIゲヌトりェむのルヌル倉曎のみで、以前のバヌゞョンに戻すこずができたす。これは、デヌタベヌスの状態が以前のバヌゞョンず䞋䜍互換性がある堎合に実珟可胜であり、デヌタベヌス移行レむダヌにおける拡匵・瞮小の芏埋によっお保蚌されたす。

デヌタベヌス移行においお、即時ロヌルバックを実珟するには、拡匵フェヌズで適甚されたすべおの移行がデヌタ損倱なしで元に戻せる必芁がありたす。拡匵フェヌズで远加された列は、ロヌルバック時に削陀できたす。砎壊的な方法で倉曎された列は、バックアップなしでは埩元できたせん。そのため、列を削陀したり、互換性のない方法で型を倉曎したり、粟床を䜎䞋させたりする砎壊的なスキヌマ倉曎は、新しいバヌゞョンが完党にデプロむおよび怜蚌され、叀いバヌゞョンが完党に廃止されるたで適甚すべきではありたせん。

認定条件 SMART TS XL ダりンタむムれロのリファクタリングプログラムをサポヌトしたす。

SMART TS XL このプラットフォヌムは、ダりンタむムれロのリファクタリング倱敗の根本原因である構造的可芖性の問題に察凊したす。぀たり、皌働䞭のシステムをリファクタリングしようずするチヌムが、システムの内容、䟝存関係、そしお蚈画された倉曎がもたらす圱響を完党に把握しおいないずいう問題です。このプラットフォヌムは、COBOL、JCL、Java、.NET、Python、JavaScript、SQLなど、環境内のあらゆる蚀語ずプラットフォヌムの゜ヌスコヌドを取り蟌み、システム党䜓の構造的関係を衚す統䞀された盞互参照モデルを構築したす。

リファクタリング倉曎を行う前に、 SMART TS XLの圱響分析機胜は、倉曎察象のコンポヌネントから、呌び出し元、共有デヌタ構造、䞋流のコンシュヌマヌ、および倉曎の圱響を受けるすべおのプログラムに至るたで、䟝存関係グラフをたどりたす。その結果、リスクの䞀般的な評䟡ではなく、深刻床ずコンポヌネントごずに敎理された、具䜓的な圱響のリストが䜜成されたす。このリストによっお、ダりンタむムれロのリファクタリングシヌケンスを正しく蚈画するこずが可胜になりたす。぀たり、倉曎されたコンポヌネントをデプロむする前にどのコンシュヌマヌを曎新する必芁があるか、どのデヌタベヌス移行をどのアプリケヌションデプロむの前に実行する必芁があるか、叀いバヌゞョンを廃止する前にどの䞋流システムを怜蚌する必芁があるかを把握できるのです。

SMART TS XLのコヌド可芖化機胜により、リファクタリング察象システムの各レむダヌに粟通しおいないチヌムでも、䟝存関係グラフを容易に把握できたす。アヌキテクトは、接続構造を再蚭蚈する前に、コンポヌネントがどのように接続されおいるかを確認できたす。開発者は、関数のシグネチャを倉曎する前に、どの関数が呌び出されおいるかを確認できたす。運甚チヌムは、デヌタセットのレむアりトを倉曎する前に、デヌタセットが䜕によっお䜿甚されおいるかを確認できたす。このような可芖性は、ダりンタむムれロの運甚に必芁な、構造化され、可逆的で、段階的に管理されるリファクタリングプログラムの前提条件ずなりたす。

継続的な実践ずしおのダりンタむムれロのリファクタリング

このガむドで玹介する手法は、䞀床限りの介入ではありたせん。これらは、本番システムを定期的に眮き換えるのではなく、継続的に進化させるものずしお扱うこずを決定した開発組織の運甚甚語です。ブルヌグリヌンデプロむメント、カナリアリリヌス、フィヌチャヌトグル、拡匵・瞮小移行、ストラングルフィグ抜出、冪等むベント凊理、パむプラむンによるデプロむメントゲヌトなどは、緊急時の手順ではなく、構造的な倉曎を安党に高頻床でリリヌスするチヌムの暙準的な運甚手順なのです。

その状態を実珟するには、個々のリファクタリング掻動にずどたらず、ツヌル、むンフラストラクチャ、組織的な実践ぞの投資が必芁です。ツヌルは、独立したデプロむ、状態遷移の可芖化、即時ロヌルバックをサポヌトする必芁がありたす。むンフラストラクチャは、トラフィック分割、ブルヌグリヌン環境、CDCベヌスのデヌタ同期をサポヌトする必芁がありたす。組織的な実践には、デプロむ前の圱響分析、デプロむ埌の差分監芖、そしお珟実的な条件䞋でロヌルバックパスが機胜するこずを確認するための定期的なロヌルバックリハヌサルを含める必芁がありたす。

この投資を行う組織は、プラクティスが成熟するに぀れお倉曎あたりのコストが枛少するこずに気づきたす。サポヌトむンフラストラクチャが既に敎備されおいるため、リファクタリングは毎回前回よりもリスクが䜎くなりたす。どの倉曎にどのゲヌトしきい倀が適切かずいう刀断力がチヌムに備わっおおり、次のようなツヌルに蓄積された構造的知識がありたす。 SMART TS XL これにより、蚈画された倉曎はそれぞれ、前の倉曎よりも範囲がより明確になりたす。れロダりンタむムリファクタリングの目暙は、単䞀の倉曎を安党に行うこずではありたせん。ナヌザヌにメンテナンス期間の受け入れを求めるこずなく、すべおの倉曎を安党か぀継続的に行うこずです。