1

我有一些Java进程(套接字程序)运行在不同的服务器上,一些在同一个网络上,一些在不同的网络上。这些过程一起有保持全球计数器的工作。客户端可以连接到这些进程中的任何一个,并向increasedecreaseget发出命令的计数器值。全球计数器应该最终一致(网络分区可能发生,我们可以从中恢复)。使用Java套接字的基本分布式计数器

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

有没有更好的方法来实现这个? 我应该使用什么协议来播放计数?会在UDP上工作吗?任何可能有帮助的Java库?

+1

您的直观解决方案称为[CRDT](http://www.cakesolutions.net/teamblogs/how-to-build-a-distributed-counter),它很好。关于它的[论文](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的工作原理与您描述的一样,使用两个分布式计数器来保持增量和减量。