速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

关注

评论 2 条评论

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

ATT&CK V11版本发布,新增结构化检测内容

青藤云安全

10个产品主导的增长原则|Bessemer

观测云

青藤参与编写的《数据安全法》实施参考(第一版)发布

青藤云安全

引领创新!青藤入选“网信自主创新尖锋企业”

青藤云安全

技术创新!青藤威胁检测论文入选国家中文核心期刊

青藤云安全

论文 威胁检测

如何使用Python实现图像融合及加法运算

华为云开发者联盟

Python OpenCV 图像处理 图像融合 加法运算

一文简述:容灾等级&保护程度

穿过生命散发芬芳

容灾 5月月更

基于STM32+华为云IOT设计智能称重系统

华为云开发者联盟

物联网 传感器 stm32 华为云IoT平台 智能称重系统

全新升级!阿里巴巴2022最新Spring源码全家桶全彩笔记开源

Java全栈架构师

spring 源码 程序员 面试 程序人生

贝壳上云&云上架构

赵亮-贝壳云原生

云原生 监控 框架 链路 扩缩容

2022年3月视频行业用户洞察:用户增长,长短视频探索共赢新模式

易观分析

短视频 视频

毕业设计项目

凌波微步

「架构实战营」

满足多用途和峰值性能需求,英特尔 Arctic Sound-M成就出色游戏串流体验

科技新消息

西门子PLC设备如何接入AIRIOT物联网低代码平台 ?

AIRIOT

物联网, PLC 低代码开发 低代码平台

又是一年开源之夏,八大课题项目奖金等你来拿!

白鲸开源

Apache 大数据 开源 DolphinScheduler workflow

一文详述DMS资源池队列阻塞告警及原理

华为云开发者联盟

数据库 资源池 DMS 队列阻塞告警 资源池队列阻塞

Node.js可以用来做什么事?

小学僧

node.js 前端 5月月更

什么是IP地址盗用?又要如何预防?

郑州埃文科技

IP地址 IP地址盗用 安全防御

银行借助纵向联邦学习 集中化进行长尾客群的精准营销

易观分析

联邦学习 联邦计算

青藤正式加入微软MAPP计划

青藤云安全

不用PyScript,网页端运行的Python编辑器

OpenHacker

Python 编辑器 代码编辑器

做不好资产清点的网络安全防护都是耍流氓!

青藤云安全

企评家 | 每日互动股份有限公司成长性评价简介

企评家

重入锁与读写锁

急需上岸的小谢

5月月更

什么是流动性池?(上)|流动性池的出现及名词解析

区块链前沿News

流动性 Hoo

应“云”而生,软件觉醒 揭秘华为云软件开发生产线DevCloud如何呼唤高效“开发”

科技热闻

龙蜥云原生机密计算 SIG 成立,7 大开源项目重磅亮相!

OpenAnolis小助手

云原生 开源项目 龙蜥社区 sig

不愧是阿里高工耗时182天肝出来1015页分布式全栈手册,从基础到高级,把分布式核心原理讲得明明白白

Java全栈架构师

程序员 架构 面试 分布式 程序员人生

手机网站一键秒变App?详细教程来了

YonBuilder低代码开发平台

APP开发 APICloud 手机网站

2年,0事故,效能提升10倍的云原生安全最佳实践

青藤云安全

金融行业 金融服务安全 青藤

当你运行npm run命令时,会发生什么

华为云开发者联盟

JavaScript typescript npm Script run命令

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