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

使用Java套接字的基本分布式计数器,java,network-programming,serversocket,distributed-system,gossip,Java,Network Programming,Serversocket,Distributed System,Gossip,我有一些Java进程(套接字程序)运行在不同的服务器上,一些在同一个网络上,一些在不同的网络上。这些进程共同负责维护一个全局计数器。客户机可以连接到这些进程中的任何一个,并发出命令以增加、减少或获取计数器值。全局计数器最终应该是一致的(网络分区可能发生,我们可以从中恢复) 到目前为止,我想到的解决方案是为所有节点在每个节点上保持递增和递减计数。在节点上发出递增命令时,它会递增其递增计数的本地副本,然后广播递增和递减计数。接收此广播的节点获取接收计数的最大值及其发送方计数的本地副本,并将结果存储为

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

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

有没有更好的方法来实现这一点? 我应该使用什么协议来广播计数?关于UDP的流言蜚语有用吗?有什么Java库可能会有帮助吗


您可能已经意识到这种设计模式,但它仍然可能是鼓舞人心的:

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

对于Java库,请查看这些库,看看它们是否让您的生活更轻松:


您可能已经意识到这种设计模式,但它仍然可能是鼓舞人心的:

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

对于Java库,请查看这些库,看看它们是否让您的生活更轻松:

听起来您需要从Akka的分布式数据库中获取一个新的数据。它使用流言蜚语向网络传达计数器的状态。您还可以对读写一致性进行细粒度控制。因此,例如,您可以执行一个
ReadMajority
,其中“将从大多数副本读取并合并值”

顺便说一句,PNCounter的工作原理与您描述的一样,它使用两个分布式计数器来保持递增和递减。

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


顺便说一句,PNCounter的工作原理与您描述的一样,它使用两个分布式计数器来保持递增和递减。

您的直观解决方案被调用,这很好。如果你想了解更多的细节,你的直觉解决方案会被调用,这很好。如果您想了解更多详细信息,请联系主题。如果我的所有java进程都是主题,并且都是观察者,并且随着节点数量的增加,每当主题上出现增量或减量时(这种情况会经常发生),主题都会发出通知,由于进程之间一直在相互通信,网络将被阻塞。如果我的所有java进程都是主体,并且都是观察者,并且随着节点数量的增加,主体将在其上发生增量或减量时发出通知(这种情况会经常发生),由于进程之间一直在通信,网络将被阻塞。