PHPからMemcacheに書き込むときに衝突を回避する方法

通常、プログラマは意図した目的でこのテクノロジを使用しますが、実験を行い、memcachedサーバーをスケーラブルな一時キー=値ストレージとして使用することにしました。

Memcachedは、衝突を回避するためのシステムを提供しないため、静的データの単純なキャッシュ用に設計されています。



データ記録



標準的な状況


PHPアプリケーションが単一のサーバーで実行され、memcachedがリモートマシンで実行されるとします。 アプリケーションはWEBではないため、1つのプロセスしか存在しないため、問題なく同じセルを読み書きできます。 プロセスの直線性により、同じセルに異なるデータを同時に書き込むことはできません。

2つ以上のプロセス


今日、アプリケーションを2つのサーバーに分割する必要があり、問題が始まりました。 memcacheへの書き込み中に衝突が発生しました。 ケースの80%で、アプリケーションはデータを1つのセルに同時に書き込もうとすることが判明しました。 理想的なソリューションは共有メモリを使用することですが、Memcachedとは異なり、拡張性はありません。 大量のコードとアプリケーションの書き換えに要する推定時間のため、松葉杖を追加することが決定されました。



Aglorythmの読み取り-書き込み





2つのデーモンが記録のために単一のデータセルに同時にアクセスしていることを想像してください。これは避けられません。 通常の状況では、衝突が発生します。 次のように行動します。







memcacheの同じセルを異なるPIDで上書きする2つのデーモンのテスト結果。



:



: 17699

: 100000

: 89.012994 .

:



: 92999

: 100000

: 139.522396 .






デーモンアルゴリズム:





テストでは、データのほぼ半分が失われたことが示されています。



通常の開発者(Redis、MemcacheDBなど)の場合、この奇跡を書き直す必要があります。



このアルゴリズムを使用すると、MemcacheをGearmanとして使用することもできます。 キャッシングサーバー自体の欠点は残っていますが、ほとんどの場合は現れません。



All Articles