Architecture 设计Facebook规模的messenger/chat服务器

Architecture 设计Facebook规模的messenger/chat服务器,architecture,chat,facebook-messenger,messenger,system-design,Architecture,Chat,Facebook Messenger,Messenger,System Design,我发现一些文章概述了facebook messenger的体系结构,但我想深入了解 以下是我知道的几件事(如果我错了,请纠正我) 当发送方发送消息时,我们需要将其存储在某个持久数据存储中,如果此时接收方处于联机状态,我们需要将这些消息发送给接收方。这应该是无缝的,也就是说,接收方不应该轮询新消息 以下是我的一些想法 想法1 -在ApplicationServer内部,我们将为每个接收器维护一个通道,将与该接收器相关的所有新消息推送到通道中,从该通道读取并推送到客户端 我们如何维护到每个发送

我发现一些文章概述了facebook messenger的体系结构,但我想深入了解

以下是我知道的几件事(如果我错了,请纠正我)

  • 当发送方发送消息时,我们需要将其存储在某个持久数据存储中,如果此时接收方处于联机状态,我们需要将这些消息发送给接收方。这应该是无缝的,也就是说,接收方不应该轮询新消息
以下是我的一些想法

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

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

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

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

以下是我的几个问题

应用服务器堆栈

  • 如果接收者在线,如何直接转发消息
  • 如何维护同一接收器的多个客户端,即如果接收器通过移动应用程序、web浏览器登录。如何将消息转发到所有客户端
  • 如何在应用服务器中维护连接,以便应用服务器将推送消息(如果有),而不是客户端连续轮询服务器
  • 我们如何为每次对话维护标记为已读功能
  • 当接收者联机时,如何推送接收者的所有未读消息
  • 如何高效地获取会话历史记录
  • 如何扩展到数百万发送者/接收者
持久数据存储

  • 什么是最适合聊天类应用程序的数据存储
  • 数据的存储格式是什么
如果你想投否决票,请说明原因


你们每个人的问题都需要分解成单独的问题,并在上下文中提问。但为了给您一个提示,几乎每一层(如Redis)中都需要像WebSocket和缓存/查找表这样的持久连接。