分散アーキテクチャにおけるエラーハンドリングは、中央集権的で予測可能かつ、ネットワークサービスでの作業中に避けられないさまざまな種類の障害に耐えられるものであるべきです。Retry、Circuit Breaker、Timeout、Fallback、および中央集権的なログ記録/監視といったパターンを使用することをお勧めします。
原則:
Pythonでのpybreakerライブラリを使用したCircuit Breakerの例:
import pybreaker import requests breaker = pybreaker.CircuitBreaker(fail_max=3, reset_timeout=60) @breaker def get_data(): return requests.get('http://service/api/data', timeout=3) try: response = get_data() except pybreaker.CircuitBreakerError: # フォールバック: スタブまたはエラーを返す response = 'Fallback data'
重要な特徴:
エラー時にクライアントに例外の詳細を全て返すことはできますか?
いいえ。例外の詳細を明らかにすることはできません — これはセキュリティ上の脅威です。応答には一般的な情報のみを返し、技術的な詳細は内部システムにログします。
サービス間のネットワークエラーに対して単純に「リトライ」を実装するだけで十分ですか?
いいえ、「単純な」リトライは問題を悪化させる可能性があります — 固定的な再試行の代わりに、バックオフ(増加する遅延)戦略を実装するのが望ましいです。
ログは各マイクロサービスのローカルディスクに保存する方が良いですか?
いいえ。最良の選択肢は、ELK、Loki、Grafanaなどを使用しての集中ログ収集ですべてのログが一元的な地点で検索および分析可能であるべきです。