我有一些Java进程(套接字程序)在不同的服务器上运行,其中一些在同一网络上,有些在不同的网络上。这些过程共同具有维护全局计数器的工作。客户端可以连接到任何这些过程中的任何一个,并发出命令,命令increase
,decrease
或get
计数器值。全局计数器最终应保持一致(网络分区可能会发生,我们可以从中恢复)。
到目前为止,我想到的解决方案是维持所有节点的每个节点的增量计数和减少。当按节点上发出增量命令时,它会增加其自己的递增计数本地副本,然后广播其增量和减少计数。接收到此广播的节点以收到的计数的最大程度及其本地副本,并将结果存储为最新计数。当在任何节点上发出get
命令时,它给出了所有增量和减少的总和的差异。我认为这将照顾收到广播的案例,并在订单和其他不可减损中收到广播。我不想使用任何持久性层。
有更好的方法来实施此功能吗? 我应该使用什么协议来广播计数?八卦在UDP上可以工作吗?任何可能会有所帮助的Java库吗?
听起来您需要Akka的分布式数据库中的pncounter。它使用八卦将计数器的状态传达给网络。您还可以对读写一致性进行精细的粒度控制。因此,例如,您可以执行ReadMajority
,其中"将从大多数副本中读取并合并该值"。
顺便说一句,使用两个分布式计数器来维持增量和减少。
您可能会意识到这种设计模式,但它仍然令人鼓舞:https://en.wikipedia.org/wiki/wiki/observer_pattern
您可以简单地使程序的所有实例观察所有其他实例,然后如果任何人更改,他们都会互相通知(查看该链接中的图表)。
就Java库而言,查看这些图书馆,查看它们是否使您的生活更轻松:
-
http://mina.apache.org/
-
http://commons.apache.org/proper/commons-net/
-
http://hc.apache.org/