0

レプリケートされたリージョンで非同期イベント キューを使用するために、Gemfire/Geode を構成しようとしていますparallel=true。ただし、起動時に次の例外が発生します。

com.gemstone.gemfire.internal.cache.wan.AsyncEventQueueConfigurationException: Parallel Async Event Queue myQueue can not be used with replicated region /myRegion

これ (つまり、レプリケートされたリージョンでの並列キューを防止するため) は設計上の決定のようですが、なぜそうなのか理解できません。
見つけたすべてのドキュメント (主にhttp://gemfire.docs.pivotal.io/docs-gemfire/latest/reference/book_intro.htmlおよび関連ドキュメント) を読み、あらゆる種類の参照を検索しました。この例外はインターネット上にありますが、レプリケートされたリージョンをホストしている各メンバーにイベント リスナーを設定できない理由について明確な説明が見つかりませんでした。
私の結論は、レプリケートされたリージョンや並列キューに関するいくつかの基本的な概念が欠けているに違いないということですが、自分で適切なドキュメントを見つけることができないため、説明や適切なリソースへのポインタを求めています読んだ。

前もって感謝します。

編集:質問を文脈に入れましょう。
パフォーマンスを最大化するためにノード間で負荷分散される REST サービスを使用してアプリケーションにデータを送信する外部システムがあります。各ノードは同じリージョンをホストします (AB と C という名前の 3 つのリージョンとしましょう)。データは、これらすべての領域 (A から B から C) を通過し、途中で処理されます。つまり、リージョン A は受信したばかりのデータをホストし、リージョン B は部分的に処理されたデータをホストし、リージョン C は処理が完了したデータをホストします。
イベント リスナーを使用してデータを処理し、リージョンからリージョンに移動します。リージョン C のリスナーの場合は、別の外部システムにエクスポートします。
すべてのリスナーはトランザクション対応でなければなりません (繰り返しますが、そうしなければなりません)。
また、水平方向のスケーラビリティ (つまり、スループットを向上させるためにオンザフライでノードを追加すること) と、達成可能な最大量のデータ複製も必要です。
さらに、すべてのノードを同じ gemfire 構成で実行したいと考えています。

私はすでに分割された領域を使用しようとしましたが、簡潔にするためにここでは説明しない多くの理由により、それらは私のニーズに適合しません (ただ、私を信じてください、現在は不可能です)。

そのため、すべてのノードでレプリケートされたリージョンをホストすることが有効であると考えましたが、すべてのノードでイベントを個別に処理し、後でアクティブ/アクティブ シナリオでリージョンの同期を実行できるようにする必要があります。これにはイベント キューを並列にする必要があることは理解していますが、(設計上) 可能ではないようです。

したがって、(更新された)質問は次のとおりです。このシナリオは可能ですか?もしそうなら、どうすればそれを達成できますか?説明および/またはドキュメント、例、リソース、またはその他のものは大歓迎です。

繰り返しますが、事前に感謝します。

4

1 に答える 1

2

AsyncEventQueueは、 GemFireに到着したデータを他のデータ ストアに書き込むために使用されます。理想的には、これを 1 回だけ実行する必要があります。レプリケートされたリージョンのコンテンツはシステムのすべてのメンバーで同じであるため、非同期イベント リスナーは 1 つのメンバーでのみ必要であり、parallel=trueサポートされていません。

分割されたリージョンの場合、AsyncQueue をホストするメンバーが 1 つしかない場合、分割されたリージョンへのすべての書き込みもそのメンバーを介してルーティングされます。これにより、システム内に単一の競合点が生じます。この問題の解決策は、並列 AsyncQueues の導入でした。これにより、各メンバーのイベントは、そのメンバーでローカルにキューに入れられるだけになりました。

GemFire はCacheListenersもサポートします。これは、レプリケートされたリージョンに対しても各メンバーで呼び出されますが、同期的です。CacheListener にスレッド プールを導入して、同じ機能を得ることができます。

于 2016-07-19T23:04:32.923 に答える