1

私はいくつかのJavaプロセス(ソケットプログラム)を別々のサーバ、同じネットワーク上のものと異なるネットワーク上のもので動作させています。これらのプロセスはともにグローバルカウンタを維持する仕事を持っています。クライアントは、これらのプロセスのいずれかに接続し、カウンタ値をincrease,decreaseまたはgetに発行することができます。グローバルカウンタは最終的に一貫していなければなりません(ネットワークパーティションが発生する可能性があります。とそれから回復できます)。Javaソケットを使用した基本的な分散カウンタ

私が今まで考えていた解決策は、すべてのノードの各ノードで増分と減分のカウントを維持することです。インクリメントコマンドがノード上で発行されると、それはインクリメントのカウントのそれ自身のローカルコピーをインクリメントし、次にインクリメントおよびデクリメントカウントをブロードキャストします。このブロードキャストを受信したノードは、受信したカウントの最大値と送信者のカウントのローカルコピーをとり、結果を最新のカウントとして格納します。いずれかのノードでgetコマンドが発行されると、すべての増分と減分の合計の差が与えられます。私は、放送が不注意で受信された場合や他の信頼できない場合が処理されると考えています。私は永続性レイヤーを使用したくありません。

これを実装するより良い方法はありますか? カウントをブロードキャストするために使用するプロトコルは何ですか? UDPの仕事についてゴシップするのだろうか?どのJavaライブラリにも役立つでしょうか?

+1

あなたの直感的な解決策は[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

答えて

0

あなたはこのデザインパターンを認識するかもしれないが、まだ鼓舞することができる:https://en.wikipedia.org/wiki/Observer_pattern

あなたは、単にプログラムのすべてのインスタンスが他のインスタンスのすべてを観察作ることができ、それらはすべてが通知されますいずれかが変更されている場合は、お互いに(そのリンクの図を参照してください)。限りJavaライブラリなど

、それらのいずれかがあなたの人生を容易にするかどうかを確認し、これらをチェックアウト:

+0

すべてのJavaプロセスがサブジェクトであり、それらのすべてがオブザーバであり、ノードの数が増えると、増分または減分が発生する(非常に頻繁に発生する)といつでも通知されますいつも互いに話しているプロセスのために。 – azuri

0

Akkaの分散データライブラリからPNCounterが必要です。 Gossipを使用してカウンタの状態をネットワークに伝えます。読み書きの一貫性をきめ細かく制御できます。したがって、たとえば、 "値が読み取られ、大部分のレプリカからマージされる" ReadMajorityを実行できます。

ちなみに、PNCounterは2つの分散カウンタを使用してインクリメントとデクリメントを維持しながら、あなたが説明したように機能します。

関連する問題