2017-10-24 6 views
0

私は1つのエンドポイントを公開春ブートアプリケーションがあります。それは1つのクエリのparamを受け取ることができます複数の呼び出しをクラスタ内のノードを介して同じリソースに同期させるにはどうすればよいですか?

/update/1532 

は、値として「偽」または「真」のいずれかを持つことができる「承認」。例えば :

/update/1532?approve=false 

問題は更新エンドポイントが異なるクエリPARAM値と同時に呼び出すことができるということです。

このケースを処理するために、進行中のIDのSetを保持するシングルトンContextクラスを作成しました。上記の場合、最初の呼び出し後に1532のIDを保持する必要があります。そのため、同じIDを持つ2番目の要求は、「IDはすでに進行中です」というエラー応答を引き起こします。

このソリューションは、それぞれが同じデータベースに複数のノードを作成するまでにうまく機能しました。 問題は、各ノードに固有のIdのセットを持つ別のコンテキストが含まれることです。

解決策の1つは、Set on Contextクラスを置き換えることができるIdの分散キャッシュを作成することです。 しかし、私はこのアプローチが良いとは確信していません。

誰かが内部クラスタをロックするためのより良い解決策を提案できますか?

P.S. すべてのDB通信がActivitiフレームワークの枠内に隠れているため、DBトランザクションを使用して同期を実装することはできません。

テクニカルインフォメーション: Spring-boot-1.5.6; Activiti- 5.21

答えて

1

これを処理するには、共通のインフラストラクチャポイントが必要です。分散ロック(難しい)のようなものに陥ることなく、1つのノードを「マスター」として、残りをリーダーノードとして任命するだけです。

書き込みメソッドは、データを書き込むローカルロックを管理できる書き込み側ノードに要求(サーバー側可能性もある)を転送する必要があります。

また、リクエストを転送したくない場合は、メッセージを見て解決することができます。各更新のキューにメッセージをドロップし、マスターノードが読み取りを処理せずに書き込みを行うようにします。 POST(リダイレクト)をリダイレクトするか、サーバ側を再構築するために、HTTP配管の一部をスキップすることができます。

分散ロックマネージャルートを試行することをお勧めする場合は、ライブラリを選択してくださいあなた自身のことを試してはいけません。これは複雑な問題であり、多くのことを考慮する必要があります(主に障害モード、永久にロックがかからない、デッドロック検出など)。

0

リアルタイムではありませんが、通常、ハローキャストを使用してアプリケーションメモリマップをノード間で複製します。 Hazelcastは、応答が許可される前にグリッド全体の更新が確実に行われるので、リアルタイムに近い同期が得られます。

このアプローチを使用して、複数のデータセンターに分散された数百のノードにわたって分散状態を正常に維持するアプリケーションが1つあります。

greg

関連する問題