Udp 分布式服务器实例间的数据广播

Udp 分布式服务器实例间的数据广播,udp,go,multicast,apache-zookeeper,service-discovery,Udp,Go,Multicast,Apache Zookeeper,Service Discovery,我正试图在我的特定应用程序中获得一些关于服务“名册”建议的反馈。我有一个与客户端保持持久套接字连接的服务器应用程序。我想进一步开发服务器以支持分布式实例。服务器“A”需要能够向其他在线服务器实例广播数据。所有其他活动实例也是如此 我正在尝试研究的选项: Redis/Zookeeper/Doozer-每个服务器实例都会将自己注册到配置服务器,所有连接的服务器都会在其更改时接收配置更新。然后呢? 维护与每个服务器实例的端到端连接,并使用每个传出数据迭代列表 一些自定义UDP多播,但我需要在其上增加我

我正试图在我的特定应用程序中获得一些关于服务“名册”建议的反馈。我有一个与客户端保持持久套接字连接的服务器应用程序。我想进一步开发服务器以支持分布式实例。服务器“A”需要能够向其他在线服务器实例广播数据。所有其他活动实例也是如此

我正在尝试研究的选项:

  • Redis/Zookeeper/Doozer-每个服务器实例都会将自己注册到配置服务器,所有连接的服务器都会在其更改时接收配置更新。然后呢?
  • 维护与每个服务器实例的端到端连接,并使用每个传出数据迭代列表
  • 一些自定义UDP多播,但我需要在其上增加我自己的可靠性
  • 自定义MessageBroker—在每台服务器连接并通知时运行和维护注册表的服务。与每台服务器保持连接,以接受数据并将其重新广播到其他服务器
  • 一些可靠的UDP多播传输,其中每个服务器实例只直接广播,不维护花名册
  • 以下是我关注的问题:

    • 我希望避免依赖外部应用,比如zookeeper或doozer,但如果这是最好的解决方案,我当然会使用它们
    • 对于自定义消息代理,我不希望它成为吞吐量的瓶颈。这意味着我可能还必须能够运行多个消息代理,并在扩展时使用负载平衡器
    • 如果我成功地运行自己的多播,则多播不需要任何外部进程,但否则我可能需要使用ZMQ,这再次使我处于依赖的情况
    我意识到,我也在谈论消息传递,但它与我所使用的解决方案密切相关。 顺便说一下,我的服务器是用Go编写的。有没有关于保持可伸缩性的最佳推荐方法的想法

    *编辑目标*

    我真正想问的是,在以下情况下,在分布式服务器实例之间实现广播数据的最佳方法是什么:

  • 每个服务器实例都与远程客户端保持持久的TCP套接字连接,并在它们之间传递消息
  • 消息需要能够广播到其他正在运行的实例,以便能够将它们传递到相关的客户端连接
  • 低延迟很重要,因为消息传递可以是高速的
  • 顺序和可靠性很重要
  • *更新的问题摘要*

    如果您有多个服务器/多个端点需要相互发布/订阅,建议它们之间采用什么通信模式?是否有一个或多个消息代理将消息重新发布到发现的服务器名册?直接从每台服务器进行可靠的多播?
    如何在分布式系统中连接多个端点,同时保持低延迟、高速度和可靠的交付?

    假设所有面向客户端的端点都位于同一个LAN上(这是扩展的第一个合理步骤),可靠的UDP多播允许您将已发布的消息直接从发布端点发送到客户端已订阅该通道的任何端点。这也比通过持久存储层代理数据更好地满足了低延迟要求

    多播组

    • 中央数据库(比如Redis)可以跟踪多播组(IP:PORT)通道的映射
    • 当端点接收到具有要订阅的新通道的新客户端时,它可以向数据库请求通道的多播地址并加入多播组
    可靠UDP多播

    • 当端点接收到某个通道的已发布消息时,它会将该消息发送到该通道的多播套接字
    • 消息包将包含每个服务器、每个多播组的有序标识符。如果端点接收到一条消息而没有从服务器接收到上一条消息,那么它将向发布服务器发送一条“未确认”消息,表示它错过的任何消息
    • 发布服务器跟踪最近消息的列表,并重新发送NAK'd消息
    • 要处理服务器仅发送一条消息而无法到达服务器的边缘情况,服务器可以在其NAK队列的生存期内向多播组发送数据包计数:“我已发送24条消息”,使其他服务器有机会NAK以前的消息
    您可能只想实现PGM

    持久存储


    如果您最终长期存储数据,存储服务可以像端点一样加入多播组。。。但是将消息存储在数据库中,而不是发送给客户端。

    现在想提一提的是,Redis作为数据历史的持久存储,可能不可避免地成为系统的一部分。因此,我认为这可能是注册服务和通过其发布/订阅功能进行通知的明显途径。您的延迟要求是什么?这是一个高速消息服务器,因此延迟需要很低。消息传入并广播到频道订阅者,但最终使用持久套接字服务器时,我会同时达到文件描述符限制和客户端端口范围限制。因此,我必须运行多个实例,并且仍然允许消息跳转到其他实例中的队列中,以便分发给在这些实例中可能订阅相同通道的任何人。我可以看到,这个问题实际上正在朝着低延迟消息传递的解决方案发展,而不是服务发现。发现部分的一致性要高得多,因为服务不会一直来来去去去。比如说,您将启动4个实例。可能有一个崩溃了,需要重新启动。也许你必须在某个点开始另一个来缩放。哪个文件是d