20年来,手Q从单纯的即时通讯工具,发展成为承载空间、频道、短视频、超级秀、增值服务等多项服务的平台。随着业务越来越复杂,原来设计的技术架构越来越不适应,业务之间的耦合也越来越严重。往往解决了一个问题,就会牵扯到N个问题,而且问题无法纠正。代码债不断累积,历史的包袱就像一座大山横亘在每一个手Q项目成员的面前。
2020年,我们开始进行架构升级。鉴于QQ手机的业务复杂度和代码量都非常大,架构升级的工作量估计是惊人的,所以我们采取了分阶段、渐进的演进策略来升级架构。总体回顾,手Q的架构升级时间线如下:
02 解耦与重构
2.1 解耦重构架构设计
虽然历史包袱就像一座大山,但手Q项目的成员们也有移山的意志和决心。 2020年,手Q推出了名为“产业实践”的技术架构升级项目,这标志着手Q项目首次系统性地进行业务边界划分、解耦、重构升级。
Mobile Q旧架构
从上图可以看出,老的架构虽然是模块化、插件化的,但是存在以下缺点:
主项目承载了基础和大部分业务代码,导致基础和业务代码界限不清晰。基础核心类不断扩展,业务之间的代码依赖不合理。开发效率低:代码修改泛滥导致CR、冲突解决、定位问题成本高昂,编译速度变慢。
针对以上缺点,手Q项目进行了重新设计。新架构按照业务划分模块。业务模块之间相互解耦,业务模块之间通过接口和路由进行通信。同时按照层次化设计进行划分。各层从上到下相互依赖。上层模块可以依赖下层模块,但下层模块不能反向依赖上层模块。
Mobile Q新架构
新架构的主要优点:
模块凝聚力更强,新功能开发的影响范围逐渐收敛于模块内部,提高研发效率。接口更加清晰,依赖数量减少,可测试性提高。通过单元测试和接口测试更容易保证代码逻辑的正确性,提高产品质量。
2.2 解耦重构的演进
手Q项目的各项业务相互依赖程度非常高。解耦、重构并不是一朝一夕就能完成的事情。需要分阶段设定目标,逐步优化。经过梳理,手Q项目的解耦重构分为三个阶段:
第一阶段(2020.11-2021.2)
约300万行核心代码的解耦已基本完成。共解耦了约30个基础模块、40个基础组件,核心业务模块已基本解耦。在开发新功能时,由于接口和服务实现是隔离的,依赖接口的代码将不再出现严重耦合。
第二阶段(2021.3 - 2021.6)
目标:继续解耦业务模块,构建防恶化机制。
结果:
API代码占比和依赖数量不会增加。完成防降级机制的建立,防止集成阶段的不合理修改。提升动态能力,优化插件与宿主之间的通信机制和发布效率。
第三阶段(2021.7以后)
目标:进一步完善基础模块和组件,实现分工程。
结果:
完善基础模块和公共组件的重构,建立基础模块的组件发布流程。实现通道和小世界服务的分工程并独立编译和运行。
2.3 解耦和重构的好处
在重构的基础上,梳理了依赖关系,通过三个阶段提升了模块化程度,提高了编译速度和研发效率,管道编译时间提高了50%。代码冲突也得到了显着改善。对比重构前后的数据,冲突文件数量减少了60%,冲突数量减少了30%,大大提高了开发效率。
03 NT架构升级
成功迈出改革第一步后,我们将目光转向了手Q面临的版本碎片问题。不同端独立发展,形成所谓的“烟囱”结构,代码复用率极低。这种结构带来了多终端体验不一致、终端内业务体验参差不齐、每次版本更新开发维护成本高等问题。为了解决这些问题,在提升用户体验、优化性能、提升研发效率等方面取得突破,我们不得不深入思考。正是这些迫切的需求和挑战,促使我们启动了改革的第二步——,推进手Q NT架构升级项目。
在NT架构设计之初,我们就坚信不应该继续打补丁,而应该采用最新的、合理的技术理念,放弃简单的打补丁的方法。这次升级不仅是一次大刀阔斧的技术改造,更是一次深思熟虑的技术改造。我们非常重视制定清晰可行的实施路径,不至于造成架构的大规模动荡。目标是以更少的人力投入实现更高的工作效率和结果,保证升级过程中的效率和稳健性。这种做法不仅保证了项目的顺利进行,也为未来的技术开发和迭代奠定了坚实的基础。
3.1 NT架构实现的难点
由于QQ手机历史悠久、用户基础庞大,该项目在业务和用户层面都表现出极大的复杂性。具体来说,项目层面的挑战包括:
代码量巨大:手机上有近千万行代码,形成了一个技术庞然大物。测试复杂度高:测试用例多,功能复杂,部分文档缺失。过时的依赖组件:项目依赖于一些过时且维护不善的组件,以及大量未维护的二进制库。研发流程保障:架构升级的同时,需要保证研发流程的平滑过渡,避免影响研发效率。
用户层面的挑战包括:
在长达一年多的升级过程中,日常版本需要正常迭代。用户本地数据量巨大,比如本地消息数据库超过10G。项目需要在优化技术的同时提升用户体验和活跃度,确保技术优化在用户侧实现价值。
面对这些复杂情况,项目的核心难点主要集中在以下三个方面:
海量功能项目的架构升级和统一:针对所有终端、所有功能、所有项目团队的整体升级,确保架构升级过程无间隙。手Q经过20多年的发展,被彻底重构。这是非常困难的,而且没有任何资料可以参考。 IM全链路架构重写升级:解决老技术债务,优化消息架构,平滑迁移用户历史数据,提升消息性能。 QQ 消息架构有旧的技术债务。在QQ的许多历史版本中,没有统一的消息ID生成规则,没有统一的存储和索引解决方案,消息类型也在无序地扩展。因此,不仅需要对整个IM链路进行重写和优化,而且过程中还要平滑迁移用户历史数据,最终完成升级,保障用户数据和用户体验不受影响。用户体验提升和主动数据提升:在不影响用户习惯的情况下逐步优化核心功能体验,通过体验提升促进产品数据增长。重写代码不可能一下子全部完成。核心功能体验必须在不影响用户习惯的情况下保持并逐步优化。
这些挑战不仅说明了手机QQ NT架构升级项目的复杂性,也证明了我们面对前所未有的技术困难的决心。
3.2 NT架构设计
为了实现架构升级和统一,项目组首先使用C++开发了具有QQ IM核心功能的跨平台内核层:集成IM核心业务逻辑(好友、群组、频道等消息逻辑,数据和关系链逻辑、图片、语音视频等富媒体收发逻辑、实时音视频逻辑等)、QQ通用组件(数据库、协议编解码、网络传输等),以及线程/网络/IO等通用资源管理模块和操作系统封装部分,是各个平台原生的。语言实现统一到C++ 跨平台层。
为了控制项目质量风险,NT跨平台内核首先连接的用户数量相对较少,而完成功能紧迫性较高的桌面端则用新的架构完全重写。
在顺利完成桌面端的功能验证和质量测试后,我们开始了向移动端的迁移,并成功完成了iOS和Android平台的集成。
当然,移动访问远没有图中描绘的那么容易。接下来介绍解决方案和主要流程。
3.3 IM全链接重写及升级
基于新NT架构,QQ的核心技术升级是IM全链路的升级。 IM消息数据来源复杂,历史负担重。升级过程中遇到的第一个难点是数据转换以及现有数据迁移到新版本:
老版本QQ中,好友消息没有唯一标识字段,这对导入和去重影响很大。 2012年之前的版本,群组消息不支持漫游,消息没有唯一字段。各个平台的消息数据格式不同,复杂度较高。 iOS 和Android 各有大约200 种消息类型。富媒体(图片、视频、语音、文件)资源存储在不同的目录结构和命名中。特殊消息,如结构化消息、方舟消息、小灰条消息等,需要进行转换,完成业务的排序和剔除工作。还有由于各种功能的变化而导致的遗留数据问题,例如小组和讨论组的退出或解散。
因此,IM首先需要精简。基于用户价值考虑和零基础思维,项目组完成了消息格式的统一,彻底精简了消息和会话类型,为QQ消息的长期稳定奠定了基础。
在统一全端格式和精简类型的基础上,我们开始设计一个新的跨平台统一的客户端DB,采用尺寸、性能和安全性的全面最优解决方案。然后我们考虑如何将旧DB的数据平滑升级到新DB。移动终端与桌面终端不同。活跃用户全年在线。部分手机本地明文消息的DB文件超过10G。加上富媒体、文件等,总数据量超过100G。而且移动终端存储空间小,功耗小。由于敏感度、后台查杀进程等各种限制,需要设计周密的升级策略,保护用户的核心数据资产不丢失。
计划要点:
断点续传:在移动场景下,进程随时可能被杀死或退出。确保消息不丢失或重复。用户分类:根据消息数据大小,将用户分为三类,并进行不同的体验优化,减少对用户的影响。优化发热和电池消耗:限制导入速度,防止手机发热。手机切换到后台后导入停止。对于消息数据较多的用户,引导用户在后台设置导入。监控:监控并报告各种导入异常情况,随时跟进用户反馈。
通过精心设计的升级策略、多轮内部推演、外部100级升级、全方位监控、掩盖策略,确保信息不丢失。最后结合监控数据和用户反馈数据,完成了所有用户的所有数据到新数据库的平滑迁移。
3.4 核心功能优化与完善
不仅是新闻,在NT架构的重写升级过程中,QQ的核心功能也得到了更加彻底的重构。手Q原生功能已大规模解耦,通用部分优化集成为统一的NT-Runtime原生组件(NT组件服务和框架层)。基于重构的架构,性能也得到全面优化。
采用基于单向数据流的MVI架构,实现业务解耦。预加载和异步渲染实现无缝消息滑动。消息加载并行化,减少首屏和滑动时的加载时间。消息动态加载和释放以优化内存使用。 200+业务组件延迟加载,实现数据分层、按需加载。
其他QQ主要场景,如消息列表页面、消息及富媒体发送接收、图片视频查看等也采用相同路径进行优化,最终性能得到全面提升。
04 总结
手Q在20多年的发展过程中,应用功能的不断扩展、代码量的不断增长,积累了巨大的技术债务,给原有的架构带来了沉重的负担。通过一系列的架构演进和技术升级,QQ手机成功从臃肿转向模块化、高效、稳定。
客户端架构从各终端的烟囱架构逐步升级为NT架构,实现多终端、跨平台复用,减少了多终端维护的人力成本,提高了QQ全终端开发效率,铺设为QQ的持续发展和技术迭代奠定了坚实的基础。
标签:
用户评论
哇,手Q技术升级史,真是让人惊叹啊!没想到我们的QQ还能这么强大。
有7位网友表示赞同!
手Q技术架构升级,真是给用户带来了很多便利,期待更多新功能。
有6位网友表示赞同!
移山都怕了,手Q的技术升级简直是无敌了,必须给点个赞!
有11位网友表示赞同!
手Q的技术升级史,每一代都有新突破,佩服工程师们的智慧。
有8位网友表示赞同!
看了手Q技术架构升级,感觉自己对互联网的发展有了更深的认识。
有7位网友表示赞同!
手Q技术升级史,见证了我国科技的发展,真是让人自豪!
有7位网友表示赞同!
手Q的技术架构升级,感觉像是在移山,但工程师们做到了!
有7位网友表示赞同!
手Q升级史,每一次都是质的飞跃,真是越来越强大了。
有15位网友表示赞同!
移山不怕,手Q的技术升级更让人震撼,期待更多创新。
有19位网友表示赞同!
手Q的技术架构升级,感觉就像是在和山对话,太神奇了。
有10位网友表示赞同!
看了手Q的升级史,感觉自己以前用的QQ太落后了。
有9位网友表示赞同!
手Q技术升级,真的解决了太多使用上的痛点,太实用了。
有15位网友表示赞同!
手Q的升级史,让我看到了技术的进步,也看到了团队的辛勤付出。
有5位网友表示赞同!
移山不容易,手Q的技术升级却如此顺畅,这就是实力啊!
有14位网友表示赞同!
手Q的技术架构升级,让我对手Q有了全新的认识,太棒了。
有16位网友表示赞同!
每次看到手Q的升级,都觉得自己离科技前沿更近了一步。
有20位网友表示赞同!
手Q的技术升级,不仅让用户体验更好,也让对手Q的信心倍增。
有7位网友表示赞同!
手Q的升级史,让我看到了一个团队的成长和突破。
有18位网友表示赞同!
手Q的技术架构升级,真是用心良苦,为用户着想。
有5位网友表示赞同!
手Q的技术升级,让我对手Q的未来充满了期待和信心。
有10位网友表示赞同!