我有一些Java进程(套接字程序)运行在不同的服务器上,一些在同一个网络上,一些在不同的网络上。这些过程一起有保持全球计数器的工作。客户端可以连接到这些进程中的任何一个,并向increase
,decrease
或get
发出命令的计数器值。全球计数器应该最终一致(网络分区可能发生,我们可以从中恢复)。使用Java套接字的基本分布式计数器
到目前为止,我想到的解决方案是在每个节点上为所有节点维护一个增量和减量的计数。当一个增量命令在节点上发出时,它会增加其自身的增量计数本地副本,然后广播其增量和减量计数。接收此广播的节点将收到的计数的最大值以及发件人计数的本地副本,并将结果存储为最新计数。当在任何节点上发出get
命令时,它会给出所有增量和减量之和的差值。我认为这将处理无法接收广播和其他不可靠性的情况。我不想使用任何持久层。
有没有更好的方法来实现这个? 我应该使用什么协议来播放计数?会在UDP上工作吗?任何可能有帮助的Java库?
您的直观解决方案称为[CRDT](http://www.cakesolutions.net/teamblogs/how-to-build-a-distributed-counter),它很好。关于它的[论文](https://hal.inria.fr/file/index/docid/555588/filename/techreport.pdf)如果你想了解更多的细节。 – Oleg