分散システムのコードレビューチェックリスト

分散システムのコードレビューチェックリスト

マイクロサービス アーキテクチャは、現在ソフトウェア エンジニアリング コミュニティで広く採用されている手法です。このアーキテクチャ スタイルを採用する組織は、ビジネス ロジックの実装の複雑さに加えて、分散障害の複雑さにも対処する必要があります。

分散コンピューティングの誤りは十分に文書化されていますが、見つけるのは困難です。その結果、大規模で信頼性の高い分散システム アーキテクチャを構築することは困難な問題となります。結果として、非分散システムでは適切に見えるコードでも、ネットワーク相互作用の複雑さを Web に導入すると大きな問題になる可能性があります。

数年にわたって本番コードで障害モードに遭遇し、さまざまなコードでその原因を突き止めてきた結果、私は (他の多くの人と同様に) より一般的な障害モードのいくつかを特定しました。これらは企業や言語スタックによって若干異なりますが (社内のインフラストラクチャとツールの成熟度によって異なります)、これらの 1 つ以上が運用上の問題の原因となることがよくあります。

ここでは、分散環境でのシステム間通信に関連するコードをレビューするために使用する基本的なチェックリストとして機能するコード レビュー ガイドラインをいくつか示します。これらの方法はすべて常に当てはまるわけではありませんが、いずれも非常に基本的な質問なので、これを機械的にリスト化し、不足している項目にマークを付けてさらに議論することは、便利で安心できると思います。そういう意味では、これはおそらく常に従いたくなるようなばかげたリストです。

リモート システムを呼び出すときに、リモート システムに障害が発生するとどうなりますか?

どれだけメンテナンスを考慮してシステムを設計しても、いつかは故障します。これは、本番環境でソフトウェアを実行する上での事実です。バグ、インフラストラクチャの問題、トラフィックの急増、無視された緩やかな減少などにより失敗する可能性がありますが、失敗しました。呼び出し元がこの障害をどのように処理するかによって、アーキテクチャ全体の回復力と堅牢性が決まります。

  • エラー処理パスを定義する: エンド ユーザーの目の前でシステムがクラッシュするのを放置するのではなく、コード内にエラー処理パスを明確に定義することが不可欠です。適切に設計されたエラー ページ、エラー メトリックを含む例外ログ、フォールバック メカニズムを備えたサーキット ブレーカーなど、エラーは明示的に処理する必要があります。
  • 回復計画を作成する: コード内のすべてのリモート操作を考慮し、中断された作業を再開するために何を行う必要があるかを把握します。ワークフローは、障害ポイントからトリガーできるようにステートフルな状態を維持する必要がありますか?失敗したペイロードをすべて再試行キュー/データベース テーブルに投稿し、リモート システムが復旧したときに再試行しますか? 2 つのシステムのデータベースを比較し、何らかの方法で同期させるスクリプトはありますか?実際のコードが展開される前に、明確で、できれば体系的な復旧計画を実装して展開する必要があります。

リモート システムの速度が低下するとどうなりますか?

これは、リモート システムが正常に動作しているかどうかわからないため、完全な障害よりも危険です。この状況に対処するには、常に次の点を確認する必要があります。

リモート システム コールには常にタイムアウトを設定します。これには、リモート API コール、イベント パブリッシング、およびデータベース コールのタイムアウトが含まれます。私はこの単純な欠陥を非常に多くのコードで発見したので、衝撃的ではあるが、予想外でもない。何らかの理由でリモート システムが応答しなくなった場合に待機してリソースを無駄にしないように、呼び出し内のすべてのリモート システムに対して制限された適切なタイムアウトが設定されていることを確認します。

  • タイムアウト後の再試行: ネットワークとシステムは信頼性が低く、再試行はシステムの回復力にとって絶対に必要です。再試行により、システム間の相互作用における多くの「バグ」が排除されることがよくあります。可能であれば、再試行時に何らかのバックオフ(固定、指数)を使用します。再試行メカニズムに少しジッターを追加すると、少し余裕ができます。負荷が大きい場合は、呼び出されるシステムを部屋内に配置すると成功率が向上する可能性があります。再試行のもう 1 つの側面はべき等性です。これについては、この記事の後半で説明します。
  • サーキットブレーカーを使用する: この機能を事前にパッケージ化した実装は多くありませんが、企業が社内で独自のラッパーを作成しているのを見たことがあります。このオプションがある場合は、ぜひ実践してください。そうでない場合は、構築に投資することを検討してください。エラーが発生したときにフォールバック状況を定義する明確に定義されたフレームワークを持つことの良い前例があります。
  • タイムアウトを失敗のように扱わないでください。タイムアウトは失敗ではなく、未定義の解決をサポートする方法で処理する必要がある未定義の状況です。タイムアウトが発生した場合でもシステムが同期を維持できるように、明確な解決メカニズムを確立する必要があります。これらには、単純な調整スクリプトからステートフル ワークフロー、デッドレター キューなどが含まれます。
  • バッチ処理を制御された方法で使用します。処理するデータが大量にある場合は、ネットワークのオーバーヘッドを排除するために、リモート呼び出し (API 呼び出し、データベースの読み取り) を 1 対 1 で実行するのではなく、バッチで実行します。ただし、バッチ サイズが大きいほど、全体的な待ち時間が長くなり、失敗する可能性のある作業単位が大きくなることに注意してください。したがって、バッチ処理はパフォーマンスとフォールト トレランスを向上させるために最適化されます。

システムを構築するとき、他の人は

  • すべての API はべき等である必要があります。これは、API タイムアウトを再試行することの裏返しです。呼び出し元は、API が安全に再試行でき、予期しない副作用が発生しない場合にのみ再試行する必要があります。 API とは、同期 API と任意のメッセージング インターフェイスを意味します。クライアントは同じメッセージを 2 回発行できます (またはブローカーは同じメッセージを 2 回送信できます)。
  • 応答時間とスループットの SLA を明確に定義し、それに準拠するようにコードを作成します。分散システムでは、発信者を待たせるよりも、早く失敗する方がはるかに優れています。確かに、スループット SLA を達成するのは困難です (分散レート制限自体を回避するのは困難です) が、これらの問題を回避したい場合は、SLA を認識し、積極的に通話を失敗させる規定を用意する必要があります。もう 1 つの重要な側面は、ダウンストリーム システムの応答時間を把握して、システムが処理できる最高速を判断できるようにすることです。
  • バッチ API の定義と制限: バッチ API を公開する場合、最大バッチ サイズを明確に定義し、必要な SLA によって制限する必要があります。これは、SLA を実現した場合に必然的に生じる結果です。
  • 事前に可観測性について考えましょう。可観測性とは、システムの内部を見なくてもシステムの動作を分析できることを意味します。システムについてどのような指標を収集する必要があるか、また、これまで尋ねたことのない質問に答えるためにどのようなデータを収集する必要があるかについて、事前に考えてください。次に、このデータを取得するためにシステムを計測します。これを行うための強力なメカニズムは、システムのドメイン モデルを識別し、ドメインで何かが発生するたびにイベントを発行することです (例: 要求 ID 123 を受信し、要求 123 に対する応答が返される - これら 2 つの「ドメイン」イベントを使用して、「応答時間」と呼ばれる新しいメトリックを導出する方法に注意してください。生データ >> 事前に決定された集計)。

一般的なガイドライン

  • プロアクティブなキャッシュ: ネットワークは不安定なので、データの使用方法にできるだけ近い形で、できるだけ多くのデータをキャッシュします。もちろん、キャッシュ メカニズムはリモート (別のマシンで実行されている Redis サーバーなど) にすることもできますが、少なくともデータを制御ドメインに持ち込み、他のシステムの負荷を軽減できます。
  • 失敗の単位を考慮する: API またはメッセージが複数の作業単位 (バッチ) を表す場合、失敗の単位は何でしょうか。ペイロード全体が一度に失敗するか、または個々のユニットが独立して成功または失敗するか。部分的に成功した場合、API は成功コードまたは失敗コードで応答しますか?
  • システムのエッジで外部ドメイン オブジェクトを分離する: これは長期的に見るともう 1 つの問題です。再利用の名の下に、他のシステムのドメイン オブジェクトをシステム全体で使用すべきではありません。これにより、私たちのシステムが他のシステムのエンティティのモデリングに結合され、他のシステムが変更されるたびに、多くのリファクタリングを行うことになります。常に独自のエンティティ表現を構築し、外部ペイロードをそのスキーマに変換してから、システム内で内部的に使用する必要があります。

これらのガイドラインが、分散システム コードにおける最も一般的なバグの削減に役立つことを願っています。簡単に適用できて非常に効果的な他の考慮事項があると思われる場合は、ぜひお聞かせください。ここに追加できます。

<<:  クラウドへの移行の準備方法: チェックリスト

>>:  クラウド コンピューティング: ビジネスを破滅させる可能性のある 7 つの致命的なミス

推薦する

求人サイトの運営スキルと経験について簡単に説明します

私は3年間、機能的なウェブサイト運営の指揮を執ってきました。この3年間、業界ウェブサイトの最も基本的...

SEO 業界のボトルネックに春が訪れるのはいつでしょうか?

みなさんこんにちは。謝凱です。このタイトルを見ると、多くの人が同じように感じるかもしれません。SEO...

hostodo-$14/年/2IPv4/1gメモリ/90gハードドライブ/3Tトラフィック/3コンピュータルーム

私はhostodoから特別プロモーションVPS、OpenVZ仮想、1Gメモリ、90Gハードディスク、...

360 と Baidu は秘密戦争を続けるだろう。モバイル インターネットが新たな戦場となる。

360が検索エンジンを立ち上げて以来、360とBaiduの争いは止まったことがなかった。最近の政府当...

人気のない業界の企業にとって、ブランド用語、タグワード、ロングテールワードだけを使うだけで十分でしょうか?

最近、企業サイトで働いている多くの友人と話をしたところ、インターネット上で非常に悪いことが起こってい...

ウェブサイト運営を理解するための4つの視点

ウェブサイト運営者は、プラットフォーム上の毎日のUVとIPに主に責任があり、ウェブサイトプラットフォ...

racknerd: 「May Day」安価な年間 VPS、年間 18.88 ドル、月間 5T の大容量トラフィック、KVM/1.5G メモリ/25g ハードディスク

5月1日の国際メーデーに、Racknerd は特別版の安価な年間支払い VPS をそれぞれ 200 ...

北京はオンライン融資プラットフォームを調査する可能性あり、中央銀行はP2Pによる違法な資金調達を警告

記者の張仙安が北京からレポートします6月には北京の望金宝と深センの客訊が再び逃亡したと報じられ、中央...

大企業が取り組んでいるコンテナ技術とは一体何でしょうか?

導入有名な雑誌「エコノミスト」はかつて「コンテナがなければ、グローバリゼーションはあり得ない」と評し...

外部リンクが多いのにウェブサイトがランク付けされない理由を分析しましたか?

SEO 最適化に関して言えば、内部の最適化に加えて、外部リンクも非常に重要です。しかし、多くのウェブ...

オンラインローンプラットフォーム保証の混乱:保証会社は単なる見せかけだと非難されている

今年の10のオンライン融資プラットフォームの取引量は主に4億から17億の間で分布している。一部のプラ...

理にかなったクラウド回帰 5 つ

今日、ますます多くの企業が、選択したアプリケーションをクラウドからオンプレミスまたはホストされたデー...

クラウド ネイティブのヒント: OrbStack — ローカル K8s 環境向けのドメイン名マッピング最適化、開発者の新たなお気に入り

今日は、新しいパートナーであるOrbStack[2]を紹介したいと思います。OrbStackのスロー...

SEOは今後どのように発展していくのか

テレビドラマの魔術師のように検索エンジンの今後の発展を予測できるわけではありませんが、近年の発展傾向...

10.22 多数の医療ステーションが破壊された後、医療ステーションの管理者は何をすべきでしょうか?

今日は10月20日月曜日です。いつものように朝から会社に来ました。パソコンの電源を入れた後、まずウェ...