使用Java套接字的基本分布式计数器

时间:2017-09-13 20:46:10

标签: java network-programming serversocket distributed-system gossip

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

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

  

有没有更好的方法来实现这个?   我应该使用什么协议来广播计数?请问关于UDP的八卦工作?任何可能有用的Java库?

2 个答案:

答案 0 :(得分:0)

您可能已经意识到这种设计模式,但它仍然可能具有启发性:https://en.wikipedia.org/wiki/Observer_pattern

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

就Java库而言,请检查这些库,看看它们是否会让您的生活更轻松:

答案 1 :(得分:0)

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

顺便提一下,PNCounter按照您的描述工作,使用两个分布式计数器来维持增量和减量。