写点什么

钉钉企业级 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:559490
用户头像
小智 让所有人认同的文字称不上表达

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

关注

评论 2 条评论

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

第一周学习架构方法总结

三板斧

谈谈力软快速开发平台B/S专业报表工具

Learun

小程序 敏捷开发 开发者工具 报表

就餐卡系统第一周作业「架构师训练营第 1 期」

天天向善

学习

架构方法周总结第一周作业「架构师训练营第 1 期」

天天向善

学习

聚焦2020云栖大会 边缘计算专场畅谈技术应用创新

阿里云Edge Plus

Vitalik Buterin: 协作的好坏两面

安比实验室SECBIT

区块链 博弈论 协作

UML图

饺子

第一周作业

Geek_4c1353

极客大学架构师训练营

程序员写个人技术博客的价值与意义

Java架构师迁哥

Vue-防止重复点击指令

老菜鸟

Vue 指令

实战中学习浏览器工作原理 — HTML 解析与 CSS 计算

三钻

CSS 大前端 浏览器

食堂就餐卡系统设计

熊桂平

系统设计 极客大学架构师训练营 UML

[Go] 设置各种选项的最佳套路

eddix

设计模式 Go 语言

加速连接效率 阿里云推出5G消息使能平台MEP

阿里云Edge Plus

架构师技术栈

elfkingw

食堂就餐卡系统UML设计 - 架构师训练营第1周作业

netspecial

极客大学架构师训练营

云图说 | 通过Helm模板快速部署中间件应用

华为云开发者联盟

容器 k8s

Servlet 知识点

陈靓-哲露

简直人生外挂,直接涨薪20K,跪谢这份性能调优实战指南

小Q

Java MySQL 架构 JVM 性能调优

领域模型的定义

Braisdom

Java 领域驱动设计 ObjectiveSql

抓住这些BUG程序员进大厂也就这回事,工作后2到3年进大厂操作指南

Java架构师迁哥

非暴力拆解:小熊派NB-IoT通信扩展板

华为云开发者联盟

IoT 通信 芯片

食堂就餐卡系统设计

一个节点

极客大学架构师训练营

阿里云发布边缘计算视频上云解决方案 为海量视图处理提供城市级云基础设施

阿里云Edge Plus

边缘计算

整合Micrometer与Prometheus & ElasticSearch

李欢颜

第一周学习总结

饺子

架构师训练营01周 -- 命题作业

骏马

极客大学架构师训练营

云栖大会CDN技术专场:如何构建企业级内容分发加速体验?

阿里云Edge Plus

CDN

非传统的“易观”,和他的技术驱动之路

易观大数据

大咖布道丨证券行业规模化敏捷和核心能力演进

华为云开发者联盟

产品 证券 大咖

多方计算——打开区块链应用新场景

CECBC

区块链 大数据

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