pythonzmq多客户机到多服务器发现消息模式

2024-09-30 02:26:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在这个问题上苦思冥想了一段时间,终于向专家求助了。你知道吗

语言:python

问题/设置:

我有很多客户,客户[n],客户[n]。。等
我有很多服务器,服务器[n],服务器[n]。。等等

每台服务器可以插入5个外部ws连接。在任何时候,我都可能需要打开[x]个ws-connections;可能2个,可能32个,我需要的ws-connections总数,因此需要的服务器是动态的。。。你知道吗

每个客户端可能从服务器[1]连接1个ws连接,从服务器[2]连接1个ws连接。等等

我想象的流程是如何运作的

  • 新客户端[1]已加载,需要2个ws-feed
  • 新客户端[1]广播[xpub/xsub?]给所有服务器的消息说,“嘿,我需要这些2ws连接,谁拥有它们?”你知道吗
  • 服务器[1]用ws-connections回复客户机[1](而且只有那个客户机)-“我得到了你要找的东西,跟我谈谈”
  • 客户机[1]与服务器[1]进行请求/应答通信,以便客户机[1]可以利用服务器[1]的ws连接对其进行查询,例如,“嘿,服务器[1]可以访问ws[1],您可以请求[x]吗”。。服务器[1]答复客户端[1]'这是您对ws请求的答复'

tldr

  • 客户端将有多个req/rep和多个服务器
  • 服务器将处理许多客户机
  • 客户机需要广播/找到合适的客户机与之进行消息传递

Tags: 服务器语言客户端客户机客户wsfeed动态
2条回答

Zyre协议是专门为无中介的“八卦”发现而设计的。Pyre(https://github.com/zeromq/pyre)是Python实现。它为节点加入“发现组”和共享信息提供了机制。除此之外,它允许组成员对单个成员耳语或对所有成员喊叫(多播)。你知道吗

Zyre使用UDP广播信标来启动联系,因此它通常仅限于一个子网(UDP广播通常不会转发到子网之外)。但是,您可以通过每个子网中的服务器跨不同的子网桥接一个组(见下文)。你知道吗

您可以使用zyre将拓扑信息(在本例中是您的服务器列表)分发给您的客户机。你知道吗

我只玩了一点柴堆,所以我可能没有完全正确的所有细节,但我会尝试这样设置它:

  1. 定义Zyre组。你知道吗
  2. 每个服务器。。。
    • 加入小组。你知道吗
    • 在信标头中设置其服务器地址(ip或fqdn,可能还有端口)。你知道吗
  3. 每个客户。。。
    • 加入小组。你知道吗
    • 从从服务器接收的HELLO消息中读取服务器地址。你知道吗
    • 与服务器建立REQ连接。你知道吗
    • 根据一段时间内收到的HELLO/LEAVE/AVOID消息添加/删除服务器连接。你知道吗

如果服务器不在同一子网中(例如,可能它们位于不同的AWS可用性区域),您可以预先配置服务器以了解所有服务器ip是什么,定期验证它们是否已启动(通过服务器之间的REQ/REP或PUB/SUB),并向本地组发送活动服务器信息。客户端可以使用此信息通知/调整其活动服务器/连接的列表。你知道吗

我已经考虑过做上面的事情,但不幸的是,它没有超出待办事项中的其他优先级,所以我还没有超过上面的细节级别。你知道吗

我将集中讨论发现问题。客户机如何知道哪些服务器可用以及每个服务器都有哪些ws连接?你知道吗

一种方法是添加第三种类型的节点,称之为broker。只有一个代理,所有客户机和服务器都知道如何访问它。(例如,所有客户机和服务器都配置了代理的IP或主机名。)

当服务器启动时,它向代理注册自己:“我有ws-feeds x,y,z和accept-requests on 1.2.3.5:1234”。代理跟踪这个状态,可能是在一个哈希表中。你知道吗

当客户机需要ws-feed y时,它首先联系代理:“哪个服务器有ws-feed y?”如果代理知道谁拥有feedy,它会将服务器的IP和端口提供给客户机。然后,客户机可以直接与服务器联系。(如果多个服务器可以访问feed y,那么代理可以返回服务器列表,而不是单个服务器。)

如果服务器运行“长”时间,客户机可以缓存“服务器X有feed y”信息,并且只在需要访问新feed时与代理对话。你知道吗

在这种设计中,客户机使用代理查找感兴趣的服务器。服务器根本不需要了解任何有关客户端的信息。而且“真正的”流量(客户机通过服务器访问feed)仍然是直接在客户机和服务器之间完成的,不涉及代理。你知道吗

嗯。我绝对不是专家。你知道吗

相关问题 更多 >

    热门问题