高負荷(通常は高い信頼性を意味します)用のシステムを設計している場合、単一障害点を持つことは決して良い考えではありません。一貫性のあるビューを提供するサービスがダウンした場合、データベースがすべてを照会されるため、せいぜいパフォーマンスが大幅に低下し、最悪の場合、アプリケーション全体が機能しなくなります。
あなたの質問では、あなたは一貫性について心配しているようです。eBayのアーキテクチャについて学ぶべきことがあるとすれば、それは可用性/冗長性/パフォーマンスと一貫性の間で行われるべきトレードオフがあるということです。100%の一貫性は必要なく、少しの「混乱」から逃れることができます。
分散キャッシュ(memcacheなど)は、スケーラブルなインフラストラクチャを作成するために広く使用されている分散ハッシュテーブルのバッキングとして使用できます。正しく実装されている場合、キャッシュは冗長になり、キャッシュは動的にリングに参加したり、リングから離れたりする可能性があります。
ヘッダー( ETag)とソフトウェア(リバースプロキシとしてのSquidプロキシなど)を適切に使用してHTTPレイヤーをキャッシュできるため、RESTも本質的にキャッシュ可能です。ヘッダーを介してキャッシュを指定することの1つの欠点は、ヘッダーを解釈して尊重するクライアントに依存することです。
ただし、Phil Karltonを言い換えると、キャッシングは困難です。キャッシュするデータ、キャッシュするタイミング、およびそのキャッシュを無効にする方法を選択する必要があります。無効化は、次の方法で実行できます。
- タイマーベースの手段を介して(2分間キャッシュしてからリロード)
- 更新が行われると、関連データを含むすべてのキャッシュが無効になります。
実装が簡単なタイマーベースのアプローチに部分的であり、古いデータがシステムに存在する期間を比較的確実に言うことができます(たとえば、会社の詳細は2時間で更新され、株価は10秒で更新されます) 。
最後に、高負荷はユースケースにも依存し、トランザクションの量によっては、これが当てはまらない場合があります。方法論(もしそうなら)は次のようになります:
- システムがキャッシュなしで機能していることを確認します(機能しますか)
- パフォーマンス基準(リクエスト/秒、稼働時間の目標など)を満たしていますか
- ボトルネックを最適化する
- 必要に応じてキャッシュを実装する
結局のところ、そもそもパフォーマンスの問題はなく、単一のデータベースと優れたバックアップ戦略で解決できる可能性があります。