【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

关注

评论 2 条评论

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

js 高精度计算 - decimal.js 库

程序员海军

JavaScript 精度 高精度计算

交易所开发中心化交易所与去中心化交易所

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 交易所源码 NFT开发

如何解决基因行业海量数据传输难题?镭速传输给出答案

镭速

大数据传输

软件测试|缺陷的生命周期是怎么样的

霍格沃兹测试开发学社

软件测试|Vue常用指令-条件渲染(v-if)

霍格沃兹测试开发学社

企业大数据平台建设七大场景,看这本指南就够了

Geek_2d6073

数智化时代,企业如何深度推进业财融合?

用友BIP

业财融合 2023全球商业创新大会

软件测试|测试平台开发Flask操作数据库-ORM

霍格沃兹测试开发学社

如何加快跨国传输大文件的速度?

镭速

跨国传输大文件

软件测试|Pycharm基础使用介绍

霍格沃兹测试开发学社

软件测试|测试平台后端开发Flask操作数据库-数据CRUD(增删改查)

霍格沃兹测试开发学社

软件测试|测试平台后端开发Flask操作数据库-多对多

霍格沃兹测试开发学社

苹果证书分类及作用详解,助力开发者高效管理应用程序

雪奈椰子

ios 开发 IOS云打包

智能合约DAPP系统开发

西安链酷科技

DAPP智能合约交易系统开发 DAPP系统开发 DeFi质押挖矿 NFT链游

DAPP质押挖矿系统开发

西安链酷科技

DAPP系统开发 流动性挖矿

SpringBoot 如何优雅的进行全局异常处理?

这我可不懂

springboot

软件测试|Flask操作数据库-一对多

霍格沃兹测试开发学社

酷克数据推出AI开发工具箱HashML 加速企业级AI应用落地投产

酷克数据HashData

软件测试|测试平台后端开发Flask框架-集成Swagger文档

霍格沃兹测试开发学社

DAPP开发与经济模型设计

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 交易所源码 NFT开发

永续合约交易所软件开发的探讨

西安链酷科技

dapp开发 链游开发

软件测试|Pycharm常用插件介绍

霍格沃兹测试开发学社

交割合约交易所开发APP

西安链酷科技

合约量化 合约交易所开发 量化合约

公链开发联盟链开发区块链浏览器开发钱包开发

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 链游开发 公链开发

期权交易所搭建APP

西安链酷科技

合约交易所开发 交易所开发软件开发 秒合约

去中心化流动性挖矿系统开发

西安链酷科技

软件开发 DeFi去中心化系统开发 DAPP系统开发 DeFi质押挖矿 DeFi流动性挖矿

永续合约交易平台搭建

西安链酷科技

数字货币交易所开发 交易所搭建 秒合约 质押挖矿系统开发 期权交易所

喜讯!极限科技再次荣获一项国家发明专利授权

极限实验室

发明专利 数据分区 二维拆分算法

去中心化兑换交易所开发

西安链酷科技

DeFi流动性挖矿 去中心化钱包

Python从0到1丨详解图像锐化的Sobel、Laplacian算子

华为云开发者联盟

Python 人工智能 华为云 华为云开发者联盟 企业号9月PK榜

NFT交易所交易平台开发功能以及创新设计

区块链软件开发推广运营

交易所 质押挖矿 数字藏品开发 区块链开发 NFT开发

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