問題タブ [gemfire]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
deadlock - デッドロック検出 - Gemfire 8
RegionShortcut.PARTITION と setRedundantCopies(1) を使用して GemFire リージョンを定義しました。3 つの異なる VM で実行されている 3 つのアプリケーションが、これらのリージョンを利用しています。
アイテムをキャッシュに挿入したばかりのアプリケーション (アイテムの「所有者」) の VM をシャットダウンしているときに、デッドロックが発生したようです。
*ブロックされたプロセス: region.put の前にブロックされました。
*ブロッキング プロセス: リージョンから古いエントリを削除しようとした後、ブロックされたようです。この操作は、CacheListenerAdapter によって提供される破棄メカニズムによって呼び出されると思われます。
次のリンクでこの問題に関するいくつかのドキュメントを読みました: CacheListener Interface APIおよびこのブログでは、主にリスナーの使用法が原因であることがわかりました。
それでも、この問題は GemFire 6.x バージョンで対処および修正されたようです [例:こことここ]
だから、私は尋ねたい:
1) この問題は Gemfire 8 で報告されていますか? または7?
2) この問題の推奨される回避策は何ですか? ここでは、3 つの異なる回避策について説明します。他にもありますか?好ましいものはありますか?
参考までに、ブロッキング プロセスのスレッド ダンプは次のとおりです。
locking - Gemfire クライアント/サーバー アーキテクチャとリージョン ロック
私はクライアント サーバー Gemfire アーキテクチャを使用しています。複数のサーバーが「グローバル」スコープでレプリケートされたリージョンを共有しています。
クライアント領域が次のように定義されているクライアントがあります。
このクライアント リージョンは、サーバー上のグローバル リージョンのプロキシとして機能します。
ここで、最初のクライアントが重要なタスクを実行している間、他のクライアントがそれを変更できないように、いくつかの操作を実行している間、クライアントからリージョンをロックしたいと思います。
残念ながら、例外があります:
では、クライアント側からリージョンをロックする方法はありますか?