私はいくつかのJavaプロセス(ソケットプログラム)を別々のサーバ、同じネットワーク上のものと異なるネットワーク上のもので動作させています。これらのプロセスはともにグローバルカウンタを維持する仕事を持っています。クライアントは、これらのプロセスのいずれかに接続し、カウンタ値をincrease
,decrease
またはget
に発行することができます。グローバルカウンタは最終的に一貫していなければなりません(ネットワークパーティションが発生する可能性があります。とそれから回復できます)。Javaソケットを使用した基本的な分散カウンタ
私が今まで考えていた解決策は、すべてのノードの各ノードで増分と減分のカウントを維持することです。インクリメントコマンドがノード上で発行されると、それはインクリメントのカウントのそれ自身のローカルコピーをインクリメントし、次にインクリメントおよびデクリメントカウントをブロードキャストします。このブロードキャストを受信したノードは、受信したカウントの最大値と送信者のカウントのローカルコピーをとり、結果を最新のカウントとして格納します。いずれかのノードでget
コマンドが発行されると、すべての増分と減分の合計の差が与えられます。私は、放送が不注意で受信された場合や他の信頼できない場合が処理されると考えています。私は永続性レイヤーを使用したくありません。
これを実装するより良い方法はありますか? カウントをブロードキャストするために使用するプロトコルは何ですか? UDPの仕事についてゴシップするのだろうか?どのJavaライブラリにも役立つでしょうか?
あなたの直感的な解決策は[CRDT](http://www.cakesolutions.net/teamblogs/how-to-build-a-distributed-counter)と呼ばれています。詳細については、[paper](https://hal.inria.fr/file/index/docid/555588/filename/techreport.pdf)を参照してください。 – Oleg