NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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:373633

评论

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

ES6集合引用类型Map与WeakMap

大熊G

JavaScript 前端 6月月更

IDEA 中使用 Big Data Tools 连接大数据组件

JasonLee实时计算

flink

bootstrap深入学习

恒山其若陋兮

6月月更

5分钟了解CDN的功能及原理

穿过生命散发芬芳

CDN 6月月更

Git 如何从特定的提交中创建一个新的分支

HoneyMoose

Flink 源码:广播流状态源码解析

JasonLee实时计算

flink 源码

【Spring 学习笔记(三)】Spring Bean 属性注入

倔强的牛角

spring Java EE 6月月更

测试的核心竞争力是什么?

老张

软件测试 核心竞争力

实战Redis序列化性能测试(Kryo和字符串)

程序员欣宸

Java redis 序列化 6月月更

日本动画发展史简述——动画及日本动画起源

头顶胖次

6月月更

React Native 资源更新增量包的优化实践

Shopee技术团队

前端 React Native

创业 2 年值得分享的事情

琚致远

创业 apache 社区

SAP Restful ABAP Programming 编程模型的 Action 实现和云端调试介绍

Jerry Wang

云计算 云原生 SAP abap 6月月更

【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!

冰河

并发编程 多线程 高并发 异步编程 6月月更

C#入门系列(四) -- 常量和变量

陈言必行

C# 6月月更

Flutter:创建透明/半透明的应用栏

坚果

6月月更

Web Service进阶(二)如何用Apache TCPMon来截获SOAP消息

No Silver Bullet

6月月更 Apache TCPMon

5款 React 实时消息提示通知(Message/Notification)组件推荐与测评

蒋川

JavaScript 低代码 React 组件 消息提示通知

如何在项目中直接使用Hystrix?

编号94530

Java spring Hystrix 熔断器

Discourse 支持中文用户名

HoneyMoose

SDN系统方法 | 3. 基本架构

俞凡

架构 网络 sdn SDN系统方法

java可变参数(详解+代码样例)

写代码两年半

面试 javase 可变参数 6月月更

leetcode 77. Combinations 组合(中等)

okokabcd

LeetCode 搜索 算法与数据结构

透过华为军团看科技之变(二):机场轨道

脑极体

【LeetCode】独特的电子邮件地址Java题解

Albert

LeetCode 6月月更

给 Print SQL Connector 添加随机取样

JasonLee实时计算

flink 源码 flink 实战

如何在 WordPress 中嵌入 iFrame

海拥(haiyong.site)

WordPress 6月月更

Android 音视频——NuPlayer的渲染模块

程思扬

音视频 安卓 音视频开发

数据库每日一题---第2天:查找重复的电子邮箱

知心宝贝

数据库 算法 前端 后端 6月月更

Redis篇之协议与序列化

邱学喆

redis协议 序列化操作 luttuce

sap.ui.core.IAsyncContentCreation 这个标记接口在 SAP UI5 框架中的应用

Jerry Wang

前端开发 前端框架 Fiori SAP UI5 6月月更

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