设计 Facebook 规模的信使/聊天服务器

Rag*_*ghu 5 architecture chat system-design messenger facebook-messenger

我发现一些文章概述了 facebook Messenger 的架构,但我想深入了解。

信使架构

这是我所知道的一些事情(如果我错了请纠正我)

  • 当发送者发送消息时,我们需要将消息存储在一些持久数据存储中,如果接收者当时在线,我们需要将这些消息发送给接收者。这应该无缝地发生,即接收者不应该轮询新消息

这是我的一些想法

想法 1 - 在应用程序服务器内部,我们将为每个接收者维护一个通道,将与该接收者相关的所有新消息推送到该通道中,从该通道读取并将其推送到客户端。

我们如何维护每个发送者/接收者线程(即对话)接收到的消息?

想法 2 - 在应用程序服务器内部,我们将为每个发送者-接收者组合(即对话)维护一个通道,并从所有接收者通道读取数据并将其推送到客户端。

我们如何处理每个接收器的这么多通道?

这是我的几个问题

应用服务器堆栈

  • 如果收件人在线,如何直接转发消息?
  • 如何维护同一接收者的多个客户端,即接收者是否通过移动应用程序、网络浏览器登录。如何将消息转发给所有客户端?
  • 如何在应用服务器中保持连接,以便应用服务器有消息时会推送消息,而不是客户端不断轮询服务器?
  • 我们如何维护每个对话的标记为已读功能?
  • 如何在接收者上线时推送接收者所有未读消息?
  • 如何高效地获取对话历史记录?
  • 如何扩展到数百万个发送者/接收者?

持久数据存储

  • 最适合聊天类应用程序的数据存储是什么?
  • 数据的存储格式是什么?

如果您想投反对票,请评论原因