写点什么

Slack 实时消息处理架构,更新、更快、更稳定

  • 2023-05-12
    北京
  • 本文字数:1056 字

    阅读完需:约 3 分钟

Slack实时消息处理架构,更新、更快、更稳定

Slack 最近公布了它们是如何实现在全球范围内每天发送数百万条实时消息的。该公司提供了对其Pub/Sub架构的全面讲解,这个架构的设计目标就是管理大规模的实时消息。它强调了在不同时区和地区发送实时消息的独特挑战,以及 Slack 的工程师如何设计基础设施来处理这些挑战的。


Slack 的高级软件工程师Sameera Thangudu阐述了这种架构的重要性:

我们的服务器要为每台主机上的数千万个通道以及数千万个连接的客户端提供服务,我们的系统要在 500 毫秒内将消息传递到世界各地。凭借当前架构的线性可扩展性,我们可以为更多客户提供服务。


她表示,该公司会加强其架构,以服务更多的客户群。


该系统的后端由多个服务组成。通道服务器(Channel Server,CS)是有状态的内存服务器,持有通道的历史。这里会有一个一致性散列机制将每个 CS 映射到通道的一个子集中。在峰值时期,每个主机大约为 1600 万个通道提供服务。一致性哈希环管理器(consistent hash ring manager,CHARM)会管理 CS 的一致性哈希环,确保在 20 秒内替换掉不健康的 CS。Consul 会存储一致性哈希值的最新配置。



图片来源:https://slack.engineering/real-time-messaging/


网关服务器(Gateway Server,GS),与 CS 类似,是有状态的内存服务器。它们维护用户信息和 WebSocket 通道订阅,并作为 Slack 客户端和 CS 之间的接口。GS 会被部署到多个地理区域,以优化连接速度。管理服务器(Admin Server,AS)是无状态的内存服务器,它们是 Webapp 后端和 CS 之间的接口。最后,状态服务器(Presence Server,PS)会跟踪在线用户,支撑 Slack 客户端的绿色状态点(green presence dot)。


每个 Slack 客户端有一个到 Slack 服务器的持久性 WebSocket 连接,以接收实时事件来维护其状态。客户端需要通过几个步骤来搭建 WebSocket 连接,比如从 Webapp 后端获取用户令牌和 WebSocket 连接的设置信息。然后,客户端会初始化一个 WebSocket 连接到最近的边缘区域,GS 获取用户信息并向客户端发送第一条消息。Envoy会平衡传入的流量并处理 TLS 终止。



客户端设置完成后,在通道中发送的每条消息都会广播至通道中所有在线的客户端。消息在发送至全球范围的每个订阅的 GS 之前,要经过 Webapp API、AS 和 CS。每个收到消息的 GS 都会将消息发送至订阅该通道 ID 的客户端。



除了聊天消息,实时改变客户端状态的另一种消息类型是事件。瞬时事件,比如用户在通道中进行输入,会遵循一个略有差异的流程,因为数据库不会持久化保存这些事件。下图说明了这个流程。



原文链接:

Real-Time Messaging Architecture at Slack


相关阅读:

Slack工程师如何解决最常见的移动开发痛点

Zoom和Slack的第二曲线

2023-05-12 10:373978

评论

发布
暂无评论
发现更多内容

hive数据导入:从查询数据导入

怀瑾握瑜的嘉与嘉

大数据 hive 7月月更

亚马逊云科技 Community Builder 申请窗口开启

亚马逊云科技 (Amazon Web Services)

build 亚马逊云

Security RememberMe原理分析

急需上岸的小谢

7月月更

【直播回顾】战码先锋首期8节直播完美落幕,下期敬请期待!

OpenHarmony开发者

Open Harmony

JavaScript 设计模式之代理模式

devpoint

JavaScript 设计模式 代理模式 7月月更

一个实习生的CnosDB之旅

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

网络编程常用的几种字符编码

HoneyMoose

若干互联网暴露面的收敛及处置建议

穿过生命散发芬芳

7月月更 互联网暴露

认识线程

zarmnosaj

7月月更

RPA进阶(二)Uipath应用实践

No Silver Bullet

RPA 7月月更 Uipath

rxjs Observable 自定义 Operator 的开发技巧

汪子熙

typescript 响应式编程 angular RXJS 7月月更

BlocProvider 为什么感觉和 Provider 很相似?

岛上码农

flutter ios 安卓 移动端开发 7月月更

AirServer2022最新版功能介绍及下载

茶色酒

AirServer AirServer2022

实例讲解将Graph Explorer搬上JupyterLab

华为云开发者联盟

人工智能 GES

微信小程序利用百度api达成植物识别

是乃德也是Ned

小程序开发 7月月更

Windows11 ARM版本安装Python环境

IT蜗壳-Tango

IT蜗壳教学 7月月更

K临近算法介绍

乌龟哥哥

7月月更

创业团队如何落地敏捷测试,提升质量效能?丨声网开发者创业讲堂 Vol.03

声网

创业讲堂 生态专栏

vue-axios(三)

小恺

7月月更

微服务服务稳定性治理

阿泽🧸

微服务治理 7月月更

九章云极DataCanvas公司蝉联中国机器学习平台市场TOP 3

九章云极DataCanvas

使用BLoC 构建 Flutter的页面实例

岛上码农

flutter ios 安卓 移动端开发 7月月更

毕业季 | 华为专家亲授面试秘诀:如何拿到大厂高薪offer?

华为云开发者联盟

面试 工作 offer 大厂 毕业

极简,利用Docker仅两行命令就能下载和编译OpenJDK11

程序员欣宸

Java Openjdk 7月月更

架构师毕业总结

凯博无线

4. 对象映射 - Mapping.Mapstercover

MASA技术团队

C# .net 微软 框架 Framework

纪念成为首个DAYU200三方demo贡献者

坚果

HarmonyOS OpenHarmony OpenHarmony应用开发 7月月更 harmony

BOOTSTRAP

Jason199

bootstrap 7月月更

【LeetCode】统计值等于子树平均值的节点数Java题解

Albert

LeetCode 7月月更

精耕渠道共谋发展 福昕携手伟仕佳杰开展新产品培训大会

联营汇聚

使用环信提供的uni-app Demo,快速实现一对一单聊

环信

即时通讯 uni-app集成 环信im

Slack实时消息处理架构,更新、更快、更稳定_架构_Eran Stiller_InfoQ精选文章