高德终端技术总结:高可用架构如何练成?

前言

高德地图作为国民级应用,特别是出行场景的独特性,要确保在线导航高并发和交通安全级的超稳定性,这对技术团队提出异乎寻常的高要求,无论是终端、云端,还是“终端-云端”之间的连接,都必须实现“高可用、高性能、高效率”的技术目标。

2024年,国内外都出现过大的互联网平台的崩溃性故障,数字经济大发展的时代,这些常用的基础平台出现大故障,会迅速造成舆情和巨大的业务损失。「系统稳定性」问题一定要警钟长鸣,不可大意。

稳定性工作的性质

稳定性工作属于「流水不腐,户枢不蠹」。它和做业务的维度大不相同:稳定性工作一定要保持踏实的工匠精神、不能有丝毫的夸张或隐藏。既要做好系统的架构设计夯实地基,也要老老实实的去做大量日常繁琐的事情,还要有“功成不必在我”的心理素质。

对高德超稳定性工作的要求

  • 防架构腐化|历史上的死角和垃圾一定要坚决清理;

  • 全链路实战演练|平常多流汗,战时少流血。摒弃侥幸心理:你担心的一定会发生;

  • 多云架构支持| 任何基础设施都会出现意外。架构要「可依赖、可扩展、简单」。

2024年国庆节,高德地图的用户量突破新高。这么一个超级APP,在业务快速演进、产品体验不断完善、智能技术持续加持的压力下,如何保持“启动秒开、瘦安装包、低网络流量”,同时还要考虑“多系统、多设备、多语言(国际化)”的业务拓展要求,是一道非常难解的技术课题。现在把这几年我们在终端方面的解题思路做个整理,分享经验,以期同行批评指正,大家互相取经、教学相长,共同为中国数字经济的持续发展添砖加瓦。

背景

随着多年来快速发展,高德地图已成为了国民级超级应用,终端也不可避免面临超级应用的通用效率难题,即如何高效地支撑多系统、多设备、多语言和多业务的快速发展高德地图终端也面临着其独有的性能与稳定性难题,由于出行导航使用场景的特殊性,用户往往时间比较紧迫,对交互耗时的敏感度非常强,同时稳定性也必须保证交通安全级的高可用。

因此我们在全团队提出了“高可用、高性能、高效率”三大技术目标,发起了技术攻坚。经过全体团队的不懈努力与磨练,我们终于做到了:
「高可用」溃率达到十万分水位,并持续稳定保持低水位;
「高性能」包体积与流量双降,包体积减少近一半;启动速度实现“秒开”,达到业内领先水平;
「高效率」通过“一体化容器架构”的结构化升级,我们实现了一套架构支撑多系统、多设备、多语言和多业务,支撑国际图上线,同时在业内率先支持鸿蒙 NEXT 系统。

高德终端团队“不仅要把问题解决了,方式上更是要从技术架构和机制层面根本解题” ,这篇总结与各位技术伙伴分享与探讨过程中的探索与实践,希望能有所助益。

架构解题

过去,终端技术治理的惯性更倾向于遇题解题、单点局部运动式解题。但随着持续发展,技术债务逐渐累积,这种方式带来的成本越来越高,而且效果会反复恶化,经常出现“按下葫芦起了瓢”的情况。因此我们思考需要从这种“局部优化”到“结构性简化”的转变,用一套架构统一支撑多系统、多设备、多语言,才能系统性解决面临的问题。围绕这一方向,我们从顶层整体设计并落地了一体化容器架构:


整体设计统一容器,向下统一封装适配多环境(包括多设备、多系统、多语言、多网络、多规则),解决业务需要各自分别高成本适配各种环境的问题;向上对业务提供跨平台、可复用、一致性的一体化地图终端能力(包括Engine、UI、Service、IO、Framework),支撑多业务的快速迭代。

在技术栈设计上,除调用系统平台服务的部分使用原生语言(Java//OC//ArtTS)外,其他均使用跨平台语言,来实现最大限度的跨平台,其中对于高性能要求的能力(如地图引擎、基础库)使用C++实现,而对于高效率要求的能力(如前端页面)则使用JS实现。这样在满足性能的要求下,实现一码多端的高效跨平台开发。

篇幅所限,这里仅从启动秒开、包体积瘦身、多系统、多设备、多语言等几个方面,具体介绍我们的思考与实践。

启动秒开:按需加载框架

过去,很多能力只管功能完成,而性能问题往往被推到上线前做决策,结果常常“带伤”上线。一旦上线,这些遗留问题因为优先级低,很难再被安排优化,即上线即终点,管生不管养,这就导致问题越积越多,最后只能运动式解决,再周而复始。这就能理解为什么运动式优化,优化之后又快速反弹的原因。无论是启动性能、包体积还是存储,都存在类似的问题。

为此,针对启动性能,我们在App上制定了“秒开”的高目标,这个目标回头来看也极具挑战性,这样也倒逼我们打破过去路径依赖的思维模式,实现结构性的简化。此前整个端的架构是,所有业务模块都是在启动阶段无差别的进行初始化,比如音乐模块,即使用户不开启音乐,也会在应用启动阶段进行加载初始化。这就导致启动阶段,随着时间业务发展,越来越慢,而且每次治理后很快就会反弹。因此,终端团队通过按需加载框架的设计,一方面,实现从“全功能加载”到“即用即加载”的结构性简化,根据用户实际需求动态加载模块,减少资源浪费和性能开销。另一方面,重新定义首屏启动模块,对启动模块极致简化,同时在结构上解耦启动与具体业务,这样也避免了启动性能因后续业务迭代而恶化,做到了长治久安。


     

从结果看, 在低端机(17年 PIXEL手机)上,都能够实现启动秒开。同时,运行一年以来,在业务快速发展下,耗时持续保持平稳。

包大小瘦身&流量降本

包大小重点不只是反映体积大小的表象,更重要的是反映架构臃肿,代码债高筑,稳定性、性能和效率风险成比例上升的问题。这就像减肥,过分胖了不止是形象问题,他是一种身体不健康表征,隐含着心脑血管并发症等整体机制问题。同样包大小优化表象目标上是降体积,根本目标是整体的技术架构健康,是对整个应用各个已有模块进行架构简化、瘦身增肌,同时长序地对新增模块进行良好的架构设计。因此,在具体落地过程中我们关注两个方面:

对于降体积,上云是一个常用手段,但上云很容易带来流量成本上涨,所以从目标上我们降体积和降流量并举,避免姿势变形,拆东墙补西墙。并从整体架构上提供端云一体的全栈按需加载能力和降流量能力,在云端通过数据压缩,继承复用,差量更新进行数据优化,来减少流量;在通道上,通过升级ODR和xCDN能力,实现流量降成本;在终端通过全技术栈按需加载能力,降低包体积,并通过预加载、静默、差量加载来保证包大小降低的同时,用户数据加载体验不受损。

用户体验是综合题,包括流畅、稳定、存储、能耗等,一项项见题解题,很容易治标不治本,根本上需要产研架构设计的机制和素养的形成。所以,在推动包大小优化过程中,主要的不是包大小指标,而是更关注是否有架构设计以及设计的合理性,长期全局的架构设计要求从一开始业务设计判断上就融合考虑。所以在平台上,终端团队建立数据管控机制,从一个需求开始到下线全生命周期中每个环节中,都要保证架构的前置和全局设计。


多系统:鸿蒙高性能CAPI框架

随着设备及系统不断增多,每个系统都有自己的生态开发语言与服务特点,如果每个系统单独开发势必成本会越来越大,高德终端团队一直思考如何做到用一套代码跨平台运行来支持多系统产品。我们在各系统之上设计封装了系统服务与交互组件的平台层,基于自研的与地图深度融合的跨平台AJX前端引擎,搭建了高性能的跨平台容器环境,支持业务一次JS语言开发、多系统多设备运行。正得益于此,我们能够鸿蒙系统快速适配,在业内率先支持鸿蒙 NEXT系统。

在鸿蒙系统适配过程中,遇到了一些技术难点。鸿蒙提供的原生开发方式是ArkUI,因为其动态语言的特性,导致用其来开发平台层组件时,整体性能不理想。于是我们联合华为推进性能更高的C语言的CAPI方案演进,CAPI是ArkUI的底层绘制接口,由C语言编写,具有更好的性能以及系统一致性的体验。但应用CAPI方案也存在一些问题:一个是组件丰富度不全;另一个是一些三方模块比如lottie是以ArkUI方式提供的,代码上万行,如果翻译到CAPI上成本巨大;三是CAPI有很多枚举、万能接口,直接用成本高,易出错。我们设计了通用UI引擎,封装抽象一体化的UI套件,提供给上层开箱即用,同时,向下也支持灵活扩展其他UI库。另外建设HybridView层将CAPI不支持的复杂组件桥接到ArkUI层,在保证整体性能的同时,避免了CAPI组件不足影响业务快速迭代的问题。

多设备:多屏合一框架

由于地图应用场景的广泛性,高德地图终端不但需要支持多尺寸手机、平板、手表等移动设备,还需要支持各种车机投屏。各设备单独定制适配与维护会消耗大量人力成本,因此,整体设计了多屏合一框架,封装统一投屏接口层,组合地图面、标准化控件、状态控制一体的 地图UI 设计,通过自适应布局能力让一套方案能够支持多种投屏协议以及设备屏幕。同时,增强配置化设计,支持不同设备屏幕尺寸、屏幕方位下的灵活扩展、动态加载和高效定制。

(多屏合一&探路合一)

多语言:配置化框架

随着高德国际化的发展,需要在不同国家提供不同功能与语言,甚至还需要满足包体积、不同平台的要求,因此整体上设计了一套配置化框架来实现多应用形态,满足国际图、包体积、多平台的不同需求。

配置化设计由两种通道组成,一种是将当前语言标识上传的服务,服务根据语言不同下发相应数据,端侧根据数据进行展示,从而实现功能的配置,这种通道适用于类似信息瀑布流的服务数据驱动场景。另一种则对于功能逻辑存在于终端本地(如启动、导航链路)的场景,通过对UI组件标签进行不同语言环境下的配置,根据配置进行相应展示,实现端侧 Feature 化的配置。两种通道相互协同,能更灵活应对全球化场景下的多语言、多功能需求。

感谢

这一年,我们在技术探索和业务支持上不断突破,也在架构师机制建设中迈出扎实一步。高德内部一直强调“人人都是架构师” ,技术同学如果只把需求堆上线,不做技术架构,就没法做好技术。无论面对复杂的技术挑战,还是多样化的业务目标,我们在攻克一个个难题的同时,也清楚地知道,每一次进步都离不开全员的共同努力。

衷心感谢高德各团队的每一位成员,是你们的努力和专注,让我们一次次攻克难关。同时也感谢集团合作方在技术方面的交流学习。

这是一场协作的胜利,也是一场架构与机制的实践成果,感谢每一位参与者的付出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39106.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP套接字编程(代码)

什么是socket套接字编程? 通过Ip地址 端口号这种方式定位一台主机,这样的方式我们就叫做socket套接字。 Udp Socket 接口介绍 这些案列我们使用的接口基本都是一样的,所以在这里我先把接口介绍完,具体的细节后面在说明。 创…

C# 调用 VITS,推理模型 将文字转wav音频net8.0 跨平台

一、系统环境 操作系统:win10,win11 运行环境:dotnet8 工具:命令行,powershell 开源库:sherpa-onnx 二、工具和源码下载 开源库:https://k2-fsa.github.io/sherpa/onnx/index.html 运行环境下载 https://dotnet.microsoft.c…

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程: 最近看到很多同学都在用Coze平台操作数据,我也想了解一下工作流的搭建和数据处理过程,但是一下子又看不懂太复杂的逻辑,于是上B站搜索相关的基础教程。 Coze官方教程: 之前有看过Coze平台…

Certd自动化申请和部署SSL证书并配置https

服务器使用的华为云,之前SSL证书通过配置Cloudflare的DNS实现的,最近华为云备案提示需修改解析至境内华为云IP,若解析境外IP,域名无需备案,需注销或取消接入备案信息,改为使用Certd自搭建证书管理工具&…

AI基础01-文本数据采集

本篇文章是学习文本数据的采集,作为人工智能训练师或者数据分析师有时需要先获取数据,然后进行数据清洗、数据标注。很明显数据采集是后续步骤的基础。 1)数据采集定义 数据采集:data acquisition,DAQ 又称为数据获取…

生活电子常识-deepseek-r1本地化部署+ui界面搭建

前言 deepseek-r1 14b模型,32b模型部署在本地电脑上也能实现非常好的性能。 因此有兴趣研究了下如何在本地部署。 同时最新流行mauns工作流,他们提供一句话实现网页端任意应用的能力。实际上,你也可以用本地的模型来实现离线的ai工作流功能。…

vue3+ts中 .vue文件引入报错:找不到模块或其相应的类型声明

新创建的vue3项目在vscode打开出现报错:找不到模块或其相应的类型声明 解决:在env.d.ts文件添加配置: declare module *.vue {import type { DefineComponent } from vue// eslint-disable-next-line typescript-eslint/no-explicit-any, …

Ubuntu 22.04 二进制安装单节点 MySQL

Ubuntu 22.04 二进制安装 MySQL LTS(长期支持版)完整教程 MySQL LTS 版本选择: 目前 MySQL 8.4.4 是长期支持(LTS)版本,持续更新并保持稳定。 下载版本: 你也可以在 MySQL 官方网站确认最新稳…

安装和管理最新的Python3环境(以Mac为例)

背景: 随着大模型技术的快速发展,各种基于AI的测试技术也层出不穷,有些场景需要在较高版本的Python3环境下实现,否则可能会出现兼容性问题。另外考虑自己对于Python3的各个版本环境的管理和使用其实一直都不是特别的清楚&#xf…

【计算机网络】网络简介

文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …

【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等

Dify介绍 官网:https://dify.ai/zh生成式 AI 应用创新引擎开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用。 Dify安装脚本 目录创建 mkdir -p /data/yunxinai &&a…

人工智能和量子时代的网络安全

在不断发展的网络安全领域,人工智能和量子技术正在迅速改变游戏规则。它们的潜力有望极大地改变政府和组织保护、防御和发展系统以应对不断发展的网络威胁的方式。 人工智能 (AI) 在检测和缓解网络威胁方面表现出了巨大的潜力。人工智能算法可以快速分析大量数据、…

前端样式库推广——TailwindCss

官方网址: https://tailwindcss.com/docs/installation/using-vite 中文官方文档:https://www.tailwindcss.cn/ github地址:tailwindcss 正在使用tailwindcss的网站:https://tailwindcss.com/showcase 一看github,竟然…

《基于深度学习的指纹识别智能门禁系统》开题报告

个人主页:大数据蟒行探索者 1研究背景 1.1开发目的和意义 指纹识别作为生物特征识别领域的一项重要技术,在安全认证、犯罪侦查和个人身份验证等方面具有广泛应用前景。随着深度学习技术的迅猛发展,基于深度学习的指纹识别系统成为了当前研究…

WSL Linux 子系统download

WSL各Linux 子系统下载 WSL Linux 最新下载 微软应用商店 | Microsoft StoreWSL Linux 历史版下载复制应用商店Linux地址到转换下载地址https://store.rg-adguard.net/ Version百度网盘离线下载OracleLinux提取

Java替换jar包中class文件

在更新java应用版本的运维工作中,由于一些原因,开发没办法给到完整的jar包,这个时候,就可以只将修改后的某个Java类的class文件替换掉原来iar包中的class文件,重新启动服务即可: 1、将jar包和将要替换的cl…

23种设计模式-创建型模式-抽象工厂

文章目录 简介场景问题1. 风格一致性失控2. 对象创建硬编码3. 产品族管理失效 解决总结 简介 抽象工厂是一种创建型设计模式,可以生成相关对象系列,而无需指定它们的具体类。 场景 假设你正在写一个家具店模拟器。 你的代码这些类组成: 相…

修改服务器windows远程桌面默认端口号

修改服务器windows远程桌面默认端口号 在Windows服务器上修改远程桌面协议(RDP)的默认端口(3389)可以增强服务器的安全性,减少被恶意扫描和攻击的风险。以下是修改远程端口的详细步骤: 按 Win R 打开运行…

【MySQL】 基本查询(上)

欢迎拜访:-CSDN博客 本篇主题:【MySQL】 基本查询(上) 发布时间:2025.2.14 隶属专栏:MySQL CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 目录 Create 基本知识…

Vue3(自定义指令directive详解)

文章目录 前言一、自定义指令的生命周期钩子二、自定义指令的创建与注册使用三、扩展 简化形式​总结 前言 在Vue3中,自定义指令是一种强大的工具,允许开发者扩展和增强HTML元素的功能。以下是对Vue3中自定义指令的详细解析: 一、自定义指令…