私は現在、読み取り用に最適化されたシステムを開発しています。アーキテクチャは、信頼できる永続ストレージとしての MySQL と、MySQL データベースとクライアントの間の memcache レイヤーです。書き込みは時々発生しますが、読み取りよりもはるかに頻度が低くなります。
データベースは比較的弱いホストで実行されているため、データベースへのアクセスを最小限に抑えるインセンティブがあります。私の心の現在のプロトコルは次のようなものです:
[DB と memcache の両方のエントリは、楽観的ロックのバージョン管理シーケンスに関連付けられています]
- 起動時に、専用プロセスが現在のすべてのエントリを db から memcache にロードします。
- 書き込みが発生すると、次のようになります。
- を。memcache (memcache バージョン) からエントリ バージョンをロードします。
- b. データベース トランザクションで、(db エントリ バージョン < ロードされた memcache バージョン + 1) の場合、db の更新を試みます。成功すると、db エントリ バージョンは (memcache バージョン + 1) に更新されます。
- c. b が成功した場合は、新しいエントリとバージョン = (memcache バージョン + 1) で memcache を更新します。
- 一方、専用プロセスは定期的に db からすべてのデータをロードして memcache に配置します。これは、一部の書き込みが memcache に伝達されない場合に備えてです。ここで 2 の競合状態が発生する可能性がありますが、許容範囲内であると推定しています。
私の現在の仮定は、いつでも (memcache バージョン) <= (db バージョン) のエントリであり、したがって 2 からの複数の同時書き込みは競合状態を引き起こさないということです。
誰かがこの設計から何か問題を見つけることができますか? ありがとう!