Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 推送事件的缩放-最佳拓扑?_Architecture_Scalability_Topology - Fatal编程技术网

Architecture 推送事件的缩放-最佳拓扑?

Architecture 推送事件的缩放-最佳拓扑?,architecture,scalability,topology,Architecture,Scalability,Topology,我已经构建了一个TCP服务器,它可以处理来自客户端的RPC(请求/回复)类型的请求,但它也允许服务在特定时间下推事件 如果我将来需要扩展,RPC的东西很容易,就像web基础设施一样,我只需要添加更多节点和负载平衡 为了扩展推送消息,我需要所有服务器进行协调,因为订阅事件的客户端可能位于任何服务器上 我的选择是: 使用UDP多播/广播(如emcaster)将事件广播到所有服务器 使用TCP将服务器完全互连到彼此 发送所有事件的中央服务器和所有工作服务器 服务器连接到该服务器 [3] 但是有几层形成

我已经构建了一个TCP服务器,它可以处理来自客户端的RPC(请求/回复)类型的请求,但它也允许服务在特定时间下推事件

如果我将来需要扩展,RPC的东西很容易,就像web基础设施一样,我只需要添加更多节点和负载平衡

为了扩展推送消息,我需要所有服务器进行协调,因为订阅事件的客户端可能位于任何服务器上

我的选择是:

  • 使用UDP多播/广播(如emcaster)将事件广播到所有服务器
  • 使用TCP将服务器完全互连到彼此
  • 发送所有事件的中央服务器和所有工作服务器 服务器连接到该服务器
  • [3] 但是有几层形成一棵树

  • 我的想法是使用[1],因为它很简单,最多可用于20-30个节点。对于N的不同范围,最佳策略是什么?其中N是节点数?如果不知道更多细节,很难给出最佳策略。也许有帮助的是列出一些要考虑的事项:

  • UDP广播

    • 正如您所提到的,这将是最容易实现的
    • 为什么限制为20-30个节点?这一限制是否符合您的要求?如果是这样,那就去做吧
    • UDP广播消息是否可能受到NW元素(如防火墙)的影响
  • 互连TCP NW

    • 配置和维护一致的IP地址列表似乎是维护的噩梦
    • 特定服务器如何知道下一个要向哪个服务器发送消息?这一逻辑可能变得复杂
  • 中央服务器

      我个人认为,这是第(1)之后的第二个可能的解决方案。
    • 这个中央服务器可能需要一些非常复杂的处理来知道在哪里发送消息
  • 带树的中央服务器

    • 配置和维护噩梦
    • 4中提到的复杂逻辑在这个解决方案中会更加糟糕

  • 个人而言,我会考虑每个问题的利弊,并考虑每个解决方案如何解决需求。希望这一课会使决策更容易。

    < P>试着在中间使用一些已经发明的车轮开源软件。我当时只能想到一个,但我有900%的把握,市场上会有大量的模仿者

    Redis是一个很好的例子,可扩展、快速,并且已经有很多玩具、插件和客户端。使用大约3行代码,您可以实现发布者/订阅者功能。

    我会选择#3-中央服务器。它的可扩展性比其他选项要好得多,并且可以设计成类似于路由器表的功能,以确保只在必要时向服务器生成流量。可以动态添加其他服务器节点


    出于好奇,您是用什么语言开发服务器的?

    您的客户端是唯一可识别的吗?如果是这样,您可以跨不同的服务器对它们进行分区,并将要连接到哪个服务器的逻辑(唯一的\u ID mod N?)集成到每个客户端/服务器中

    您应该查看zeromq指南。如果您需要udp广播来补偿丢失的数据包,那么zeromq将是一个好方法。它是一个为提高效率而构建的轻量级消息传递接口。以下是C(库语言)和python的简介指南:

    C:
    Python:

    这些例子也被翻译成C++、C语言、CL、Erlang、F·菲利克斯、Haskell、java、Objul-C、Ruby、艾达、Basic、Cljule、Go、Haxe、Node.js、OOC、Perl、斯卡拉、Lua、HAXE和PHP的包装器。 ----更新---

    抱歉,这些链接似乎并没有将所有代码示例从C更改为python,但您可以获得其他语言翻译


    特别是对于推送拓扑,他们有一个关于如何在zeromq中实现pub/sub的页面:

    ,这是一个非常好的答案。UDP广播的唯一问题是(这就是为什么我编了20-30个数字)可能在某个时候网络会饱和,因为任何地方都没有逻辑过滤到达哪个服务器的消息。这也意味着每台服务器都将处理大量他们不关心的消息。我想知道一旦达到这个阶段人们会做些什么,尽管我几乎肯定不会达到那个阶段,所以将使用UDP.ZMQ为您实现所有这些模式,同时具有非常高的可扩展性和快速性:您可以使用它实现您的RPC,当您将其扩展到更多服务器时,它将实现负载平衡(REQ/REP模式,请参阅链接),您可以使用它实现通知,它允许您使用tcp或udp广播扩展到无限多的服务器(使用设备和发布/订阅模式)。@Ohad感谢您的澄清。我自己才刚刚开始关注zmq。REQ/REP模式可能更适合RPC,内置的负载平衡非常棒。此外,它们还具有纠错UDP传输(基于NAK的实用多播),因此发送给所有客户端的单个消息可以传输一次,但客户端会检查丢失的数据包:

    (另外,感谢Styxxy编辑修复我的URL的答案)感谢zeromq上的提醒。我可能会使用它,所以我已经投票了,但接受了关于拓扑的更一般的答案。谢谢投票。。。同意@Brady的答案在拓扑结构方面更好。语言是c。中央服务器的问题在于它本身不可伸缩。像Redis集群这样的东西作为中央状态/服务器是完美的,但我认为它还不成熟。也许mongodb或Cassandra insteasYou应该用C编写中央服务器。查看EPOLL系统调用,由于其边缘触发行为,它提供了几乎无限的性能。采用b级考试前考试