2月5-7日QCon全球软件开发大会携手100+位大咖讲师落定北京,点击查看完整日程>> 了解详情
写点什么

钉钉企业级 IM 存储架构创新之道

  • 2019-11-22
  • 本文字数:3668 字

    阅读完需:约 12 分钟

钉钉企业级IM存储架构创新之道

业界的 IM 产品在功能上同质化较高,而企业级的 IM 产品对于高可用、安全性又有更高的要求,如何打造具备差异化的产品,又在高可用、安全性、数据一致性等方面具备较高的品质,是企业级 IM 产品成功的关键。钉钉在过去短短几年时间里,用户数已破 2 亿,企业组织数破千万,钉钉是如何规划企业级 IM 产品的架构的?InfoQ 记者就此采访了钉钉 IM 服务端研发技术专家劲弩,劲弩也将在 ArchSummit 全球架构师峰会(北京站)2019 为我们带来《钉钉企业级 IM 存储的挑战与实践》的精彩分享,感兴趣的读者朋友可以多加关注。


不同场景,不同架构

钉钉的技术栈继承自阿里巴巴集团。阿里有着“大中台,小前台”的组织战略,所以钉钉在大的框架上是复用集团的能力,包括集团的中间件、存储引擎、微服务框架等。在此之上,钉钉聚焦在核心能力的研发,比如:IM 核心系统、系统单元化、音视频通讯,弱网优化,图片收发极致体验等等。


钉钉作为 ToB 产品,业务场景跟 ToC 的 IM 产品有很大区别,架构上也各有侧重。


第一是万人群。在钉钉里,企业的组织关系映射到 IM 的群,产生了为数众多的超级大群。和 500 群人数上限相比,钉钉支持万人大群,大幅提升了群的触达人数。


如此数目繁多的万人群给 IM 系统的流量冲击巨大。在节假日,特别是元旦、春节或者双 11 这样的重大活动时期,管理层和员工在大群高频互动,流量洪峰瞬间流过 IM 系统,挑战着系统的极限。


为支撑好超级大群,钉钉做了以下多点的优化:


  • 降低存储扩散量

  • 最早 IM 使用写扩散模型,一万人的群发一条消息写一万次消息收件箱。优化为读扩散模型后,一条消息只需写一次消息收件箱,扩散量降低到万分之一。

  • 智能限流

  • 在节日场景下,一些大群的消息发送频率过高,可能超过系统整体容量,影响 IM 系统稳定性。如果对每个群设置较低的发送阈值,系统又没有完全发挥出容量,从而提供足够流畅的用户体验。针对这个问题,钉钉设计了一种智能限流的方法,当总体流量超过系统阈值时,自动根据当时情况对消息发送频率相对较高的大群进行限流。

  • 万人群成员多级缓存

  • 钉钉在客户端、服务端建立了群成员的多级缓存。

  • 一方面增强了用户打开 at 列表、查看群成员列表的体验。因为群成员人数增大时,打开群成员列表的延迟提升明显,用户能感受到长达数十秒的卡顿。增加客户端缓存后,用户输入 @立刻响应成员列表,即使群里有几万个群成员。

  • 另一方面避免了大量群成员读写对 DB 的压力。如果压力直接打到 DB 层,万行记录的扩散量过大,很容易造成热点,影响系统稳定性。

  • 端到端的体验保证

  • 客户端定期做极限压测,在群消息大规模刷屏的情况,保证用户体验流畅不卡顿。


第二是历史消息可回溯。在 ToB 场景下,数据属于企业的资产。企业有需求查看历史消息,因为它是关键的沟通信息。


首先是既省流量,又不遗漏的历史消息回溯协议。最近的消息通过同步协议推送到达客户端本地。而历史的消息,服务端不曾推送,客户端本地没有入库。在用户进入会话时,如果客户端发现本地消息不足,自动从服务端拉取不足的历史消息。采用这种推拉结合的协议,保证了消息不管多么久远,都可以毫无遗漏的从服务端同步下来。


然后是低成本的历史消息存储架构。消息具有典型的冷热属性:用户访问的绝大部分都是最近的数据。钉钉自研了一套冷热分离架构,在冷库使用低成本高压缩率的存储引擎,大幅下降存储成本。


最后是达到金融级安全保障的历史消息加密。为了保证历史消息的安全性,钉钉在全链路使用金融级的加密算法,不留死角,确保没有任何人可以非法获取历史消息。


第三是场景化。ToC IM 产品的场景都比较通用。比如微信群,每个人能够使用的功能集合是一样的,大家进群聊天,都可以改群昵称,群名称。


钉钉则是面向场景打造极致体验。以班级群为例,班级群里面没有用户的概念,变成了老师、家长、学生。进群后家长无法修改群昵称,完全由系统设置,比如"小明爸爸"。所以,班级群的进群路径、群管理、昵称展示,都是面向家校沟通场景的特殊优化,目的是做到家校场景的极致用户体验。


这给技术团队带来两方面的挑战。一方面是系统模型必须做到可扩展性强,足够灵活,能够快速地支持业务场景化的需求;另一方面是在维持业务快速迭代的情况下,保持核心 IM 系统的高可用性。因此钉钉的架构必须做到同时满足这两点需求。


还是以班级群为例。它使用小程序开发,不需要发版就可以做 bugfix、实现业务需求。同时服务端切分为了业务层和 IMCore 层。业务层做灵活多变的业务逻辑,迭代速度快。IMCore 层提供基础能力和扩展点,改动频次低,主要是提供高稳定性和单元化能力。服务分层后,基本做到了新需求不改动 IMCore 层。迭代速度快,系统稳定性强,达到了业务、技术皆大欢喜的局面。


第四是单元化。单元化在钉钉有多层需求:


  • 高可用。钉钉要保证 vip 用户在地域灾难的情况下可用。因此钉钉设计了一套基于单元化的异地容灾方案。当中心宕机,两分钟内一键把 vip 用户调度到容灾单元,确保用户能够正常使用 IM 基本功能。

  • 国际化。海外地区的对于数据有合规的要求。同时,钉钉在当地部署应用,也给海外用户提供了更流畅的用户体验。

  • 支持大客户及特殊行业。钉钉今天不仅承接中小企业的沟通办公,也承接不少政务大客户。他们对钉钉的诉求是具备专有云部署能力。

  • 容量。随着业务发展,所有流量在中心处理不可扩展。把流量分散到多地域是一个必然选择。


钉钉通过一套代码部署,一套运维体系实现单元化,满足了以上多层次的需求。技术团队开发了单元化基础组件,动态路由,业务层数据同步组件等一系列基础设施,可以将钉钉部署在任何一个国家或地区,甚至客户的自有机房。


高可用、安全性如何保证

企业级 IM 产品对于高可用和安全性的要求远高于 ToC 场景下的 IM 产品。一旦钉钉的消息发不出去或者收消息出现延迟,就会大面积影响企业的核心业务运转。同时,聊天数据长期保存,历史消息可实时回溯,一方面对数据存储提出了更高要求,另一方面也对数据的安全性带来了新的挑战。


  • 高可用架构:通过异地容灾、中间件冗余、存储冗余,在架构上避免单个中间件、存储或者地域的灾难对系统可用性产生影响。比如今天 IM 依赖的 DB 宕机,并不会影响用户的消息收发成功率。

  • 变更管理:核心系统控制发布频率,每一次发布必须 checklist 校验。发布可灰度、可监控、可回滚,控制问题引入的影响面。

  • 持续精进:通常大的故障都是由小的隐患累计产生。如何发现并解决系统中的隐患?得有机制性的解决方案。钉钉每天投入专人,去发现系统中的稳定性问题。常年累计下来,系统的健康度越来越高。


作为企业级应用,安全是钉钉的立身之本,也是企业客户最敏感的关注点。


  • 钉钉 IM 拥有高强度的链路加密,达到银行级数据加密级别。IM 在全链路上都是加密的,因为即使有一个点疏漏,数据就可能泄漏。所以在客户端、长连接、mq、存储、业务上下游,都做了加密。在接口访问层面,也有完善的鉴权、访问控制,确保数据不会被非法使用。

  • 数据安全上,企业还可以选择第三方加密。聊天数据同时被钉钉、三方双重加密,数据只属于企业。

  • 长期的安全技术沉淀。钉钉背后有阿里集团数千名工程师建立的安全保障机制。每一次发布都会有代码安全扫描,一般的水平权限漏洞都可以在扫描中发现,用工具把大部分漏洞扼杀在上线前。同时自主研发了动态防入侵系统,实时监测平台的安全状况,对于入侵事件具备分钟级快速发现能力及进行事件的快速响应、止血与溯源能力。

  • 攻防演练。平时多演练,战时不流血。钉钉有专门的安全团队对系统进行攻防演练,红蓝对抗,及时发现潜在的安全问题,提升入侵检测及安全应急响应能力。


存储、创新之道

不同于传统 IM,钉钉在存储方面的业务需求与技术实现都有新的要求。


由于消息需要长期保存,钉钉做存储的一个重点必然是降低长期数据的存储成本。钉钉在其中做了很多事情,比如冷热分离,读写扩散,消息清理。没有成本上的优化,业务的增长带来的是不可持续的成本增长,这是无法接受的。


另一点是存储的单元化。一般 ToC 产品的单元化主要是由国际化驱动。海外市场有合规的要求,消息必须存储在当地。对于钉钉来说,除了国际化的需求,也有组织专有部署的需求,因此钉钉的存储架构上也支持单元化部署,以及多单元的互通。


除了业务场景变化给技术带来的新要求,技术同学也会有一些 geek 的想法,从而反哺业务。比如钉钉的聊天机器人,就是 IM 技术同学自发发起的。最初,很难说清楚聊天机器人对业务的贡献,因此技术同学就自己偷偷把 MVP 做出来。做出来以后,慢慢发现确实在工作中很有价值,包括 IM 的系统报警、用户 VOC 问题解决率提醒,命令行重启单台机器等等场景,用聊天机器人非常方便,很好的提高了工作效率。所以最终决定开放给用户,也受到了用户的广泛好评。




从业务角度看如何设计数据存储,是业务架构的重点方向,也是典型的案例场景。12 月 6 日,在北京举办的  ArchSummit 全球架构师峰会(北京站)2019 上,钉钉 IM 服务端研发技术专家劲弩会分享《钉钉企业级 IM 存储的挑战与实践》话题,介绍高可用冷热存储架构和背后的思考,感兴趣可以点击官网查看会议日程。购票请联系票务经理 灰灰 15600537884(同微信)


2019-11-22 16:558861
用户头像
小智 让所有人认同的文字称不上表达

发布了 408 篇内容, 共 356.2 次阅读, 收获喜欢 1927 次。

关注

评论 2 条评论

发布
用户头像
写了蛮多,但是都是反复来回那么几句话,没实际的设计,没看到存储架构的创新点在哪里
2019-12-02 10:28
回复
重要的技术点一般都是点到即止,做过的人自然能够领会,对外公开分享当然不会说的太细。
2019-12-05 09:21
回复
没有更多了
发现更多内容

Surpass Day——Java 接口在开发中的作用、关于Object类、内部类

胖虎不秃头

Java 10月月更 se

六类网线、七类网线、八类网线区别有哪些?

wljslmz

10月月更 弱电 以太网线 综合布线

Vue网站自动提交百度链接

源字节1号

软件开发 后端开发 Vue网站

实时云渲染的关键技术是什么?

Finovy Cloud

人工智能 云渲染 实时渲染

应用监控可视化工具Grafana&Kibana对比

阿泽🧸

10月月更 监控可视化

智能合约系统开发Web3.0实现核心

薇電13242772558

智能合约

【荣耀帐号服务FAQ】AuthorizationCode有效期是多久?

荣耀开发者服务平台

手机 服务 安卓 荣耀 honor

Linux性能问题分析流程与性能优化思路

五分钟学大数据

Linux 10月月更

【愚公系列】2022年10月 Go教学课程 023-Go容器之列表

愚公搬代码

10月月更

Zebec地平线节点运营计划,将推动流支付赛道发展进程

石头财经

Surpass Day——IntelliJ IDEA和eclipse的使用、super关键字

胖虎不秃头

Java 10月月更 se

【C语言内功修炼】柔性数组的奥秘

Albert Edison

数组 C语言 10月月更 柔性数组

leetcode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 (中等)

okokabcd

LeetCode 数据结构与算法

Vue3入门指北(十二)模板引用

Augus

Vue 3 10月月更

http协议简介

向阳逐梦

Cookie HTTP协议 Cookie反爬虫 10月月更

具有资质的昆明等保测评公司新名单看这里!

行云管家

等保 堡垒机 等级保护

如何低成本实现客户服务自动化?

Baklib

使用最小花费爬楼梯

掘金安东尼

算法 10月月更

【Nacos源码之配置管理 九】客户端获取配置数据的流程

石臻臻的杂货铺

nacos 10月月更

爬虫的简介

向阳逐梦

Python语法 10月月更 爬虫简介

zookeeper-四字监控命令和工具

zarmnosaj

10月月更

数据结构学习,栈篇(顺序栈)

IC00

数据结构 算法 学习笔记 10月月更

Surpass Day——Java 抽象类和接口

胖虎不秃头

Java 10月月更 se

面试突击89:事务隔离级别和传播机制有什么区别?

王磊

Spring之IOC

楠羽

笔记 spring 源码 10月月更

如何快速打造BI大屏进行数据赋能

力软低代码开发平台

_fitoa_word的实现:一个整型数据是如何转成字符串的呢?

桑榆

源码刨析 10月月更 C++

HTML的简介

向阳逐梦

HTML标准 10月月更 HTML元素

ESP32-C3 应用程序的启动流程

矜辰所致

ESP32-C3 10月月更 ESP-IDF

Hacktoberfest 2022:Jenkins maven-snapshot-check Plugin 的改进实践

donghui

jenkins Hacktoberfest

钉钉企业级IM存储架构创新之道_ArchSummit_小智_InfoQ精选文章