Dockerで一連のマイクロサービスの作成に取り組んでいます(.netコアとAWS RDSをバックボーンとして使用していますが、それは関係ありません)。
デプロイの一部として、古いコンテナと新しいコンテナが短時間(通常30秒未満)共存して、ダウンタイムが発生しないようにします。
ただし、これは、スキーマが以前のバージョンのマイクロサービスと互換性がない場合(または古いスキーマが新しいバージョンと互換性がない場合)、1セットのコンテナーが正しく機能しないことを意味します。
私の考えは:
下位互換性のある移行のみを実行してください。つまり、delete column
の移行はありません。いくつかの混乱が蓄積する結果になるので、私はこのアプローチに感銘を受けていません(確かに、マイクロサービスのサイズであればそれほど悪くはありませんが、数年後には見苦しいスキーマになります)
廃止された2つのステップのデプロイメントを削除します。つまり、v2ではスキーマを使用するコードを削除しますが、スキーマ自体は削除しません。v3ではスキーマを削除します。ここでの問題は、ばかげているように見える2つの連続したデプロイメントを連続して行う必要があるか、開発者がそれらの削除を次のバージョンにチェックインすることを忘れないようにすることです。
あなたは何に行きますか、そしてなぜですか? (または、すでに何か他のものがある場合は、教えてください)。
変更は、必要なものだけを変更する必要があります。 DBスキーマ内の未使用の列を削除することは必要な変更ではなく、機能的ではなく、保守性のある変更です。したがって、これらの変更をすべてのサービスの同じイテレーションで発生させるためにロックする理由はありません(または、さらに言えば、サービスデプロイメントの一部になります)。
特定の「重大な変更」の展開後に、すべての展開の移行を強制するシステムを構築することは確かに可能ですが、これは、過度に最適化されている、またはYAGNIのように感じます。
私が自分のアプリの1つでそれを処理する方法は、変更制御プロセスにステップを追加することです。マイクロサービスのデプロイメントは、#1のように中断しない必要がありますが、どの列があるかを追跡します候補を削除し、(ビジネスユーザーからの賛同を得て)四半期ごと(またはそれ以上)のクリーンアップを実行します。ローリングスケジュールに基づいて、提案された削除された列が、私たちの前にある程度の時間が経過する必要があります実際に =それを削除します。多くのビジネス設定で私たちが知っていることは知っています確か二度と必要なくなることは、実際には6か月ほどで要求される機能です。
あなたの「エラー予算」は何ですか?つまり、どれだけのダウンタイムを許容でき、合意されたSLAの範囲内にとどまることができますか? SLAのアップタイムが99.95%で、サービスが99.999%のサービスを提供している場合は、そうすることができます。
ダウンタイムが30秒ある場合、SLAどれくらい減少しますか?大幅に減少する場合、一定のリリースはありませんが、毎月のリリースを計画している場合、30秒のダウンタイム30日のうち、合意された数値に悪影響を与えることはありません。
本当に30秒ですか?アプリケーションにエラーがある場合、ロールバックにどのくらいの時間がかかりますか?ブルーグリーンの展開戦略はありますか?
上から、ダウンタイムはゼロですか?その場合は、「廃止された削除」手順が必要です。良い点は、各ステップで問題を分離して、失敗したケースをそれぞれ処理できるようにすることです(つまり、ロールバック戦略)。
SLAとエラーバジェットの概念は、この GoogleのSREブック から来ました。
私の経験では、これはその方法の1つです。
APIをバージョン管理して、そのコードを非推奨/削除できるようにしてから、列を削除できるようにします
各コードセットには最小移行バージョンがあり、最小移行バージョンがデプロイされない限り、そのコードはデプロイできません。
移行には常に下位互換性があります。 「廃止されたtwpステップの削除」についての懸念を理解しましたが、ほとんどのソフトウェアは下位互換性(非推奨、削除など)を処理しませんか?