2016-08-29 11 views
0

私はEhCache 2.10.2を使用しています。 2つのサーバ間の同期レプリケーション(replicateAsynchronously = false)(S1とS2)キャッシュ複製

私は次のような状況があります。

  1. まずHTTPリクエストがS1は状態「A」で、キャッシュとDBからロードし、それをしてオブジェクトを検索し、
  2. S1をキャッシュするように置くことができないS1
  3. に行くを変更オブジェクトの状態を「B」に、DBに保存し、
  4. S1は、次の要求がS2
  5. にS2がCAにobect見つけ
  6. を行く
  7. 成功応答を送信をキャッシュしますステート "A"のche
  8. オブジェクトは2番目の要求で状態 "B"を持たなければならないので、S2はエラー応答を送信します。

サーバーがオブジェクトをキャッシュに置くと、スレッドはプッシュ操作でブロックされ、シリアル化されたオブジェクトを別のサーバーに送信し、別のサーバーがデシリアライズして要素をキャッシュに置く間は待機しません。 私たちが運が良ければ、ポイント6は状態 "A"または "B"になります。

変更がすべてのノードで複製されるまで操作をブロックするようにEhCacheを構成できますか?

EhCacheを他のキャッシュ実装と置き換える必要がありますか、すべてを変更する必要がありますか?

答えて

0

あなたが経験することは、キャッシュ複製の弱点です。あなたのシナリオは強い一貫性を必要とするようです。

キャッシュのレプリケーションでは、一貫性の欠如に加えて、キーごとのイベントの順序付けも保証されていないし、あらゆる種類の競合解決も実行しないことに注意してください。本当に最後の更新が勝つのです。

あなたに適切な保証を与えるEhcacheの唯一の機能はTerracotta clusteringです。このソリューションを展開するには、少なくとも1つの追加のサーバー/ JVMがTerracottaクラスターとして機能する必要があります。