Synchronization 在分布式客户端之间同步状态的方法

Synchronization 在分布式客户端之间同步状态的方法,synchronization,computer-science,distributed,zeromq,Synchronization,Computer Science,Distributed,Zeromq,我的问题是: 我的应用程序是一个用于web应用程序的分布式实时消息代理。来自web浏览器的客户端连接到其中一个应用程序节点。通过ZeroMQ发布/订阅机制连接的节点。若一个客户端发送消息—节点将其发布到发布套接字中,其他节点将从子套接字接收这些消息并将其发送到自己连接的客户端 但现在我需要状态和历史记录功能。状态-提供一个列表,其中包含所有已连接(到所有节点)客户端的描述。历史记录-提供最近发送的几条消息的列表。即,我需要获取应用程序的整个状态。我认为有几种实现它的方法: 1) 将有关已连接客户

我的问题是:

我的应用程序是一个用于web应用程序的分布式实时消息代理。来自web浏览器的客户端连接到其中一个应用程序节点。通过ZeroMQ发布/订阅机制连接的节点。若一个客户端发送消息—节点将其发布到发布套接字中,其他节点将从子套接字接收这些消息并将其发送到自己连接的客户端

但现在我需要状态和历史记录功能。状态-提供一个列表,其中包含所有已连接(到所有节点)客户端的描述。历史记录-提供最近发送的几条消息的列表。即,我需要获取应用程序的整个状态。我认为有几种实现它的方法:

1) 将有关已连接客户端的所有信息发送到中央服务器。然后,当客户机请求存在时,询问中央服务器并将响应返回给客户机

2) 保留每个节点上的所有信息。当客户端连接到任何节点时,使用发布操作将有关该节点的信息发送到其他节点。因此,当客户要求到场时,我可以立即回复

3) 根据需要从所有节点收集信息。我现在真的无法想象如何编程,但这样可以避免重复信息,从而减少内存消耗。在这种情况下,我不需要担心在内存中拟合所有信息

4) 使用一些分布式数据存储,比如。但我不喜欢这个想法,因为我有额外的依赖性

客户端需要每个节点连接上的状态信息,每个客户端连接/断开连接上的状态信息更改,每条消息上的历史信息更改

这是一个开源应用程序,所以我不知道它必须支持多少连接客户端。负载测试最终会显示这个数字

对这些存在和历史数据的可靠性没有严格要求


我真的需要你的建议,以下哪种选择是解决我问题的正确方法。或者有其他更好的方法吗?

基本上,在某些情况下,您所有的选项都是有效的选项

如果没有具体要求,我会选择最简单的解决方案

我认为最简单的解决方案是使用Redis之类的工具。它是稳定的,被许多公司使用(据我所知也是如此),它非常快速和灵活,很容易实现历史上的封顶列表。迭代您的需求将非常容易,因为您可以快速更改功能

如果不需要额外的依赖关系/部署,另一种选择是在服务器之间对信息进行分区(使用哈希分区或一致哈希),以便知道在何处存储/检索有关特定客户机或其他实体的信息


HTH

存在和历史数据非常自然地沿着它所属的通道线进行划分

那么,您是否考虑过在应用程序服务器之间分发通道?每个应用程序节点都可以有它知道的几个通道。有关其他通道的查询将发送到可以回答这些查询的特定节点

这可能与列表中的选项3最接近

这样,每个通道的状态数据就变成了可管理的数据块,可能小到可以保存在内存中。历史数据可以缓存在内存中,也可以缓存在特定于通道的服务器上。使用某种逐出算法来确定哪些历史数据不再值得缓存。它将从内存中删除,并准备从存储中检索


另一个供您考虑的想法是:您知道0MQ吗?我认为您可以使用它(或者受到它的启发)来推送客户机连接到的那些通道的状态和历史数据,而不是让他们从应用程序服务器中提取数据


编辑:我阅读了CHP协议,我已经有一段时间没有阅读指南了

CHP服务器将hashmap数据中的所有更改发布到所有订阅客户端。订阅者过滤数据。这就是订阅0MQ主题的工作方式,而不仅仅是CHP。但是,如果一台服务器拥有多个频道,但客户端通常只对少数几个频道感兴趣,那么客户端可能需要大量的数据

我想你们已经面临这个问题了,所以我想知道:你们现在是如何组织的

客户端在加入时检索快照,并根据子树对其进行筛选。《用户指南》中有一些有趣的细节,介绍了如何在快照到达之前将已发布的更新保留在队列中,以及如何丢弃更新之前的消息

因此,我们将在客户端执行同步,如下所示:

  • 客户端首先订阅更新,然后发出状态请求。这保证了状态将比它拥有的最旧更新更新更新

  • 客户端等待服务器回复状态,同时对所有更新进行排队。它只是通过不读取它们来实现这一点:ØMQ使它们在套接字队列中排队

  • 当客户端收到其状态更新时,它将再次开始读取更新。但是,它会丢弃比状态更新旧的任何更新。因此,如果状态更新包含最多200个更新,则客户端将放弃最多201个更新

  • 然后,客户端将更新应用于其自己的状态快照


我认为这一点肯定会引起您的兴趣。

如果这是大量信息,那么这些信息对客户有什么用处?此外,客户端是否经常或很少需要此信息,更改频率等。客户端在每次连接到节点时都需要此信息,在每个客户端的连接/断开连接时状态信息都会更改,频道历史信息在发送到该频道的每条消息上都会发生变化。我还更新了一个问题。您将支持多少用户?什么是ra