一方向だけのドアを通り抜けるのを回避することです。わかりやすく言うと、元に戻したり拡張したりするのが困難な選択肢は選ばないということです。私たちは、製品、機能、API、バックエンドシステムの設計からデプロイまで、ソフトウェア開発のすべての段階にこの原則を適用します。この記事では、私たちがこの原則をソフトウェア開発にどのように適用するかについて説明します。別の状態に変わります。ソフトウェアは、どちらの状態でも完璧に機能するかもしれません。間または後に適切に機能しない可能性があります。ソフトウェアが適切に機能しない場合、サービスの中断を招き、その結果、お客様からの信頼を失ってしまいます。この記事では、両方のバージョンのソフトウェアが予期したとおりに機能することを前提とし、デプロイ中のロールフォワードまたはロールバックがエラーにつながらないようにすることに重点を置きます。私たちは、新しいバージョンのソフトウェアをリリースする前に、ベータまたはガンマテスト環境で機能、同時性、パフォーマンス、拡張性、ダウンストリームでの障害処理など、ソフトウェアの複数の特性をテストします。このテストにより、新しいバージョンの問題を明らかにし、それを修正することができます。デプロイの成功を保証するだけでは必ずしも十分とは言えません。予期せぬ状況や本番環境でソフトウェアが最適に動作しないといった問題に直面することがあります。デプロイのロールバックによってお客様の側でエラーが発生する可能性があるという状況に陥るのを回避したいと考えています。このような状況に陥るのを回避するため、私たちはデプロイの前に必ずロールバックの準備を入念に行います。あるバージョンのソフトウェアがエラーや前のバージョンで使用できた機能の中断なしにロールバックできる場合、このようなバージョンは後方互換と呼ばれます。私たちは、私たちのソフトウェアがすべてのリビジョンで後方互換になるように計画し、それを検証します。ソフトウェアアップデートに対するアプローチについて詳しく説明する前に、スタンドアロンソフトウェアのデプロイと分散型ソフトウェアのデプロイのいくつかの違いについてお話したいと思います。つのプロセスとして実行されるスタンドアロンソフトウェアの場合、デプロイはアトミックです。つのバージョンが同時に実行されることは決してありません。(その逆も同様です)。この条件を満たせば、デプロイは安全にロールバックおよびロールフォワードできます。分散システムでは、デプロイはより複雑になります。デプロイはローリング更新によって行われるため、可用性には影響しません。新しいバージョンはホストのサブセットに一度に展開されるため、その他のホストは引き続きリクエストに対応できます。介して相互に通信します。このような通信または共有状態により、新たな課題が提示されます。書き込み側と読み取り側が異なるバージョンのソフトウェアを実行し、その結果、データについて異なる解釈をする可能性があります。読み取り側は、データをまったく読み取れず、停止する可能性すらあります。私たちは、ロールバック不能の最も一般的な理由がプロトコルの変更にあることを突き止めました。データをディスクに保存しながらデータの圧縮を開始するコード変更について考えてみてください。新しいバージョンが圧縮されたデータを書き込んだら、ロールバックできなくなります。古いバージョンは、ディスクから読み取ったデータを解凍する必要があることがわからないからです。ドキュメントストアに保存された場合、デプロイ中であっても他のサーバーはそのデータの読み取りに失敗します。つのプロセス間またはサーバー間で渡されると、レシーバーはその読み取りに失敗します。プロトコルの変更は非常に微妙である場合があります。つのサーバーを想定してください。秒間隔で相互に送信することに同意します。指定した時間内にサーバーがハートビートを認識しない場合、他方のサーバーはダウンしているとみなし、接続を閉じます。秒に増やしたデプロイを想定してみましょう。コードコミットは数値だけの些細な変更と思われます。ロールフォワードもバックワードも安全ではなくなります。秒間隔でハートビートを送信します。秒を超えるハートビートを識別せず、新しいバージョンを実行しているサーバーとの接続を終了します。大規模なフリートの場合、複数の接続でこの状況が発生するため可用性が低下します。コードの読み取りやドキュメントの設計で微妙な変更を分析するのは困難です。このため、各デプロイのロールフォワードとバックワードが安全であることを明確に検証します。フェーズデプロイと呼ばれる技術を使用します。管理するサービスを使用した、次のような仮想シナリオを検討します。このサービスは、スケーリングと可用性を目的とし、複数のアベイラビリティーゾーンにまたがったサーバーのフリートで実行されます。形式を使用してデータを維持しています。形式でデータを維持する必要性が生じます。