写点什么

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

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

关注

评论 2 条评论

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

多云网络互通问题怎么解决——SD-WAN

Ogcloud

云计算 网络 多云服务 多云架构 SD-WAN

企业用户混合云组网的新方式——SD-WAN

Ogcloud

网络 SD-WAN 混合云 混合云架构 组网

雅高与亚马逊云科技合作为宾客提供卓越体验

财见

打造绿色计算数智动力 HashData 入选“绿色计算最具价值解决方案”

酷克数据HashData

浅析JAVA日志中的几则性能实践与原理解释

阿里技术

Java 原理 性能实践

【活动回顾】Databend 云数仓与 Databend Playground 扩展组件介绍

Databend

一款功率电子开关TP6062

芯动大师

深入学习 C++编程,数据结构与算法关系

高端章鱼哥

c++ 数据结构 算法结构

某公司案例分析

尚思卓越

运维 堡垒机

马上2024年了,现在去开发一款App需要投入多少资金?

编程的平行世界

开发 Android Studio 成本管理

SD-WAN的降本增效作用是如何体现的

Geek一起出海

纯干货|聊一聊大促活动背后的技术:火山引擎边缘云CDN/DCDN/GA

火山引擎边缘云

CDN CDN加速 加速 内容分发 CDN带宽

用户指南|使用 Helm Chart 部署单机版 GreptimeDB

Greptime 格睿科技

Kubernetes 时序数据库 #数据库 Helm Charts

文心一言 VS 讯飞星火 VS chatgpt (156)-- 算法导论12.3 3题

福大大架构师每日一题

福大大架构师每日一题

软件测试/人工智能丨计算机视觉常见业务场景,原理和测试指标

测试人

人工智能 软件测试

低代码与自动化:加速软件开发的新趋势

不在线第一只蜗牛

运维 自动化 低代码

利用机器学习实现客户细分:提升市场营销效果的技术策略

快乐非自愿限量之名

机器学习 框架 客户细分

学习Motoko:开启加密编程世界的全新篇章

TinTinLand

区块链 编程

从“卷智商”到“卷情商”我们能从一场华为海外发布会学到什么?

脑极体

PC

统一观测丨使用 Prometheus 监控 Memcached 最佳实践

阿里巴巴云原生

阿里云 云原生

在 Excel 里研发俄罗斯方块;全国首例「AI 声音侵权案」审理丨 RTE 开发者日报 Vol.106

声网

SAP数据一键拉取!利用零代码ETL工具快速实现数据同步

RestCloud

数据同步 ETL SAP

Python 函数式编程让代码直接优雅起来

秃头小帅oi

三大神医齐现身,竟为医院数据中心而来?

白洞计划

AI

沉浸文旅体验!实时云渲染助力2023广东旅博会智慧文旅元宇宙体验馆上线

3DCAT实时渲染

元宇宙 实时渲染 实时云渲染 实时渲染云

Google Gemini Pro API专家级体验

Bob Lin

人工智能 AI openai LLM gemini

Milvus 老友汇|AI、云原生与向量数据库的精彩碰撞回顾!

Zilliz

云原生 Milvus AIGC KubeBlocks

都是植物补光,为什么你的没效果?

电子信息发烧客

一位CSDN的博主怀疑我抄袭他

Loken

音视频开发

【写作训练营打卡|08】写作的四大问题踩坑点总结

写作

C 语言注释和变量详解

小万哥

c c++ 程序员 后端 软件开发

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