Slack 实时消息传递架构解析
Slack 最近发布了一篇关于其全球范围内每日处理数百万实时消息的架构解析文章,详细介绍了其基于发布/订阅(Pub/Sub)模式的系统设计。该架构旨在应对跨时区和区域的实时消息传递挑战,并展示了 Slack 工程师如何设计基础设施以高效处理这些需求。
架构的核心设计
Slack 的高级软件工程师 Sameera Thangudu 强调了该架构的重要性:
我们的服务器每台主机服务于数千万个频道,连接数千万客户端,且系统能在 500 毫秒内将消息传递到全球各地。我们当前的架构具有线性扩展性,预计能够服务更多客户。
系统后端服务组成
频道服务器(CS)
- 状态化、内存中的服务器,存储频道历史记录。
- 通过一致性哈希机制将每个 CS 映射到部分频道。
- 在高峰期,每台主机可服务约 1600 万个频道。
一致性哈希环管理器(CHARMs)
- 管理 CS 的一致性哈希环,确保在 20 秒内替换不健康的 CS。
- Consul 用于存储最新的哈希配置。
网关服务器(GS)
- 状态化、内存中的服务器,维护用户信息和 WebSocket 频道订阅。
- 作为 Slack 客户端与 CS 之间的接口。
- 部署在多个地理区域以优化连接速度。
管理服务器(AS)
- 无状态、内存中的服务器,作为 Webapp 后端与 CS 之间的接口。
在线状态服务器(PS)
- 跟踪在线用户,为 Slack 客户端中的绿色在线状态点提供支持。
客户端连接与消息传递
- 每个 Slack 客户端通过持久 WebSocket 连接与 Slack 服务器通信,以接收实时事件并维护其状态。
客户端通过以下步骤建立 WebSocket 连接:
- 从 Webapp 后端获取用户令牌和 WebSocket 连接设置信息。
- 向最近的边缘区域发起 WebSocket 连接。
- GS 获取用户信息并向客户端发送第一条消息。
- Envoy 负责负载均衡和 TLS 终止。
消息传递流程
- 消息通过 Webapp API、AS 和 CS 传递。
- CS 将消息发送给全球范围内所有订阅该频道的 GS。
- 每个 GS 将消息发送给所有连接到该频道 ID 的客户端。
其他事件类型
- 瞬时事件(如用户在频道中打字)遵循不同的流程,因为这些事件不会被数据库持久化。
- 这些事件通过特定路径传递,以实时更新客户端状态。
总结
Slack 的实时消息传递架构通过高效的状态化服务器、一致性哈希机制和全球分布式部署,实现了高扩展性和低延迟的消息传递。其设计不仅支持当前的业务需求,还为未来的用户增长提供了坚实的基础。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。