1

我有一些 Java 进程(Socket 程序)在不同的服务器上运行,一些在同一个网络上,一些在不同的网络上。这些进程共同负责维护一个全局计数器。客户端可以连接到这些进程中的任何一个并向 或计数器值发出increase命令。全局计数器应该是最终一致的(可能发生网络分区,我们可以从中恢复)。decreaseget

到目前为止我想到的解决方案是在每个节点上为所有节点维护一个递增和递减计数。当在节点上发出递增命令时,它会递增其递增计数的本地副本,然后广播其递增和递减计数。接收此广播的节点获取接收计数的最大值及其发送者计数的本地副本,并将结果存储为最新计数。当get在任何节点上发出命令时,它会给出所有增量和减量之和的差值。我认为这将处理广播接收无序和其他不可靠性的情况。我不想使用任何持久层。

有没有更好的方法来实现这一点?我应该使用什么协议来广播计数?UDP上的八卦会起作用吗?任何可能有帮助的 Java 库?

4

2 回答 2

0

听起来您需要来自 Akka 分布式数据库的PNCounter 。它使用 Gossip 将计数器的状态传达给网络。您还可以对读写一致性进行细粒度控制。因此,例如,您可以执行ReadMajority“将从大多数副本中读取和合并值”的位置。

顺便说一句,PNCounter 就像您描述的那样工作,使用两个分布式计数器来维护增量和减量。

于 2018-02-23T08:46:27.160 回答
0

您可能知道这种设计模式,但它仍然可能是鼓舞人心的:https ://en.wikipedia.org/wiki/Observer_pattern

您可以简单地让程序的所有实例观察所有其他实例,然后如果任何一个发生更改,它们都会相互通知(查看该链接中的图表)。

至于 Java 库,请查看这些库,看看它们中的任何一个是否让您的生活更轻松:

于 2017-09-13T21:03:50.910 回答