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

时间:2011-09-20 01:58:39

标签: udp go multicast apache-zookeeper service-discovery

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

我正在尝试研究的选项:

  1. Redis / Zookeeper / Doozer - 每个服务器实例都会将自己注册到配置服务器,所有连接的服务器都会在更改时收到配置更新。然后怎样呢?
    1. 维护与每个服务器实例的端到端连接,并使用每个传出数据遍历列表?
    2. 某些自定义UDP多播,但我需要在其上添加自己的可靠性。
  2. 自定义消息代理 - 在每个服务器连接并通知它时运行和维护注册表的服务。保持与每个服务器的连接以接受数据并将其重新广播到其他服务器。
  3. 一些可靠的UDP多播传输,其中每个服务器实例只是直接广播而不维护名册。
  4. 以下是我的担忧:

    • 我希望避免依赖外部应用程序,例如zookeeper或doozer,但如果它是最佳解决方案,我会明显使用它们
    • 使用自定义消息代理,我不希望它成为瓶颈的吞吐量。这意味着我可能还必须能够运行多个消息代理并在扩展时使用负载均衡器?
    • 多播不需要任何外部进程,如果我设法自己滚动,但否则我可能需要使用ZMQ,这再次让我处于依赖的情况。

    我意识到我也在谈论消息传递,但它与我使用的解决方案密切相关。 顺便说一句,我的服务器是用Go编写的。有关保持可扩展性的最佳推荐方法的任何想法?

    *目标编辑

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

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

      如果您有多个服务器/多个端点需要彼此发布/发送,那么它们之间建议的通信方式是什么?一个或多个消息代理将消息重新发布到已发现服务器的名单中?直接来自每个服务器的可靠多播? 如何在分布式系统中连接多个端点,同时保持低延迟,高速和交付可靠?

1 个答案:

答案 0 :(得分:2)

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

多播组

  • 中央数据库(例如,Redis)可以跟踪多播组的映射(IP:PORT)< - >信道。
  • 当端点收到带有要订阅的新频道的新客户端时,它可以向数据库询问该频道的多播地址并加入该多播组。

可靠的UDP多播

  • 当端点收到某个频道的已发布消息时,它会将该消息发送到该频道的多播套接字。
  • 消息包将包含每个多播组的每个服务器的有序标识符。如果端点收到的消息未收到服务器的上一条消息,则会向错过的任何消息发送“未确认”消息回发布服务器。
  • 发布服务器会跟踪最近的消息列表,并重新发送NAK的消息。
  • 为了处理服务器只发送一条消息并使其无法到达服务器的边缘情况,服务器可以在其NAK队列的生命周期内向多播组发送数据包计数:“我发送了24条消息” ,让其他服务器有机会NAK以前的消息。

您可能只想实施PGM。

持久存储空间

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