最近我们团队在做一款AR眼镜的后端系统,遇到了不少架构上的挑战。

AR眼镜和普通的手机应用不一样,它对实时性、可用性、并发量的要求都很高。用户戴上眼镜之后,系统需要实时处理传感器数据、渲染画面、传输内容,任何延迟或者中断,都会严重影响用户体验。

这篇文章,我想分享一下我们在AR眼镜架构设计上的一些思考和实践,聊聊如何实现高可用和高并发的系统架构。

AR眼镜系统的特点

先说说AR眼镜系统的特点,这决定了架构设计的方向。

第一个特点是,实时性要求高。AR眼镜需要实时渲染画面,延迟必须控制在20毫秒以内,否则用户会感到眩晕。这意味着,从传感器数据采集,到内容渲染,到画面显示,整个链路的延迟都要非常低。

第二个特点是,数据量大。AR眼镜有多个传感器:摄像头、IMU(惯性测量单元)、眼动追踪、深度传感器等。这些传感器每秒产生大量的数据,需要实时处理和传输。尤其是视频流,数据量更大。

第三个特点是,并发量高。如果是消费级的AR眼镜,用户量可能达到百万甚至千万级。大量用户同时在线,同时传输数据、请求内容,对后端系统的并发能力要求很高。

第四个特点是,可用性要求高。AR眼镜是可穿戴设备,用户戴着它的时候,系统不能出问题。如果系统崩溃或者网络中断,用户看到的画面会卡住或者消失,体验非常差,甚至可能有安全风险。

第五个特点是,端云协同。AR眼镜的端侧算力有限,很多计算需要放到云端。但云端计算又有网络延迟的问题。所以需要端云协同,哪些在端侧做,哪些在云端做,需要仔细划分。

基于这些特点,我们在架构设计上做了很多针对性的优化。

整体架构

我们的整体架构,分为四层:端侧层、接入层、服务层、数据层。

端侧层,就是AR眼镜本身。负责传感器数据采集、画面渲染、端侧AI推理、用户交互。端侧层的设计原则是:能在端侧做的,尽量在端侧做,减少对网络的依赖。

接入层,负责设备接入和协议转换。AR眼镜通过WebSocket或者gRPC和后端建立长连接,接入层负责维护这些连接,做协议解析、鉴权、限流。接入层是无状态的,可以水平扩展。

服务层,是核心业务逻辑。包括内容服务、空间计算服务、AI服务、用户服务、设备管理服务等。每个服务都是独立部署的微服务,通过RPC或者消息队列通信。

数据层,负责数据存储。包括关系型数据库(用户信息、设备信息)、时序数据库(传感器数据)、对象存储(3D模型、内容资源)、缓存(热点数据)、消息队列(异步处理)。

整体架构是微服务架构,每个组件都可以独立扩展,满足高并发的需求。同时,每个组件都有冗余和备份,保证高可用。

高可用设计

高可用是AR眼镜系统的核心要求。我们从几个层面做了高可用设计。

第一个层面是,多可用区部署。我们的服务部署在多个可用区,每个可用区都有完整的服务实例。如果一个可用区出问题,流量可以自动切换到其他可用区。数据库也是多可用区主从部署,一个可用区的数据库挂了,从库可以提升为主库。

第二个层面是,服务冗余。每个微服务都部署多个实例,前面有负载均衡。如果一个实例挂了,负载均衡会自动把流量切到其他实例。我们还做了健康检查,定期检查每个实例的健康状态,不健康的实例会被自动摘除。

第三个层面是,降级和熔断。在系统压力大或者某个服务出问题的时候,我们会自动降级,关闭非核心功能,保证核心功能可用。比如,空间计算服务出问题的时候,我们可以降级为只显示基础内容,而不是整个系统崩溃。

第四个层面是,端侧容错。即使后端完全不可用,AR眼镜端侧也要能基本可用。我们在端侧缓存了常用的内容和模型,网络断开的时候,用户还能使用基本功能。网络恢复之后,再自动同步数据。

第五个层面是,灰度发布和回滚。新版本发布的时候,我们先灰度发布给一小部分用户,观察没有问题之后再全量发布。如果出了问题,可以快速回滚到旧版本。这样可以避免新版本的bug影响所有用户。

高并发设计

高并发是另一个核心要求。我们从几个层面做了高并发设计。

第一个层面是,水平扩展。所有无状态的服务,都可以水平扩展。接入层、服务层的无状态服务,流量大的时候就加机器,流量小的时候就减机器。我们用了Kubernetes来做自动扩缩容,根据CPU、内存、请求量等指标自动调整实例数量。

第二个层面是,缓存。缓存是应对高并发最有效的手段。我们用了多级缓存:端侧缓存常用内容,CDN缓存静态资源,Redis缓存热点数据。大部分请求都能在缓存层命中,不需要打到后端服务。

第三个层面是,异步处理。对于不需要实时返回的操作,我们都用异步处理。比如,传感器数据的存储、用户行为的分析、内容的转码,都通过消息队列异步处理。这样可以减少请求的响应时间,提高系统的吞吐量。

第四个层面是,数据库优化。数据库往往是高并发的瓶颈。我们做了分库分表,把大表拆分成小表,分散数据库压力。读写分离,读请求走从库,写请求走主库。对于时序数据(传感器数据),我们用了专门的时序数据库,写入和查询性能都比关系型数据库好很多。

第五个层面是,协议优化。AR眼镜和后端之间的通信,我们用了二进制协议(Protobuf),而不是JSON。二进制协议的体积更小,序列化和反序列化更快,能减少网络传输和CPU的开销。同时,我们用了WebSocket长连接,避免了每次请求都建立连接的开销。

实时性优化

实时性是AR眼镜的特殊要求。我们做了几个优化。

第一个优化是,边缘计算。我们在离用户最近的边缘节点部署了计算服务。用户的请求先到边缘节点,边缘节点能处理的就直接处理,不需要回源到中心机房。这样可以大大降低网络延迟。

比如,空间计算、内容渲染这些对延迟敏感的服务,都部署在边缘节点。用户管理、数据分析这些对延迟不敏感的服务,部署在中心机房。

第二个优化是,预测性渲染。AR眼镜的画面渲染,我们用了预测性技术。根据用户的头部运动和眼动数据,预测用户下一帧要看什么,提前渲染好。这样,即使有一定的网络延迟,用户看到的画面也是流畅的。

第三个优化是,流式传输。3D模型和内容资源,我们用了流式传输。不需要等整个模型下载完,而是边下载边渲染。用户可以很快看到内容,不需要等待很长时间。

第四个优化是,端侧预处理。传感器数据在端侧先做预处理,比如降噪、压缩、特征提取,然后再传到云端。这样可以减少传输的数据量,也减轻云端的计算压力。

数据安全和隐私

AR眼镜会采集大量的用户数据,包括摄像头画面、眼动数据、位置信息等。数据安全和隐私非常重要。

我们做了几个方面的保护:

第一个是,数据加密。所有数据在传输过程中都用TLS加密,存储的时候也加密。敏感数据(比如用户的生物特征),用了更高级别的加密。

第二个是,数据最小化。只采集必要的数据,不采集和功能无关的数据。能在端侧处理的数据,就不上传到云端。比如,眼动数据在端侧处理完就删除,不上传。

第三个是,权限控制。用户可以控制哪些数据可以被采集,哪些功能可以使用。用户随时可以查看和删除自己的数据。

第四个是,合规性。我们遵循了相关的法律法规,比如GDPR、个人信息保护法等。在数据采集、存储、使用的各个环节,都符合合规要求。

监控和运维

高可用和高并发的系统,离不开完善的监控和运维。

我们建立了全链路的监控体系:

  • 基础设施监控:CPU、内存、磁盘、网络。
  • 应用监控:请求量、响应时间、错误率、吞吐量。
  • 业务监控:在线用户数、活跃设备数、内容播放量。
  • 端侧监控:设备状态、端侧性能、网络质量。

所有监控数据都集中到一个平台,设置了告警阈值。任何指标异常,都会立刻告警,运维人员可以及时处理。

我们还做了全链路追踪。每个请求从端侧到后端,经过了哪些服务、每个服务花了多长时间,都可以追踪到。这样,出了问题可以快速定位是哪个环节出了问题。

另外,我们定期做故障演练,模拟各种故障场景(服务器宕机、网络中断、数据库故障等),验证系统的容错能力。通过故障演练,发现系统的薄弱环节,持续改进。

一些经验总结

做AR眼镜的架构设计,我总结了一些经验。

第一,端云协同是关键。AR眼镜的架构,不是简单地把计算都放到云端,也不是都放到端侧。而是要根据每个功能的特点,合理划分端侧和云端的职责。对延迟敏感的、简单的计算放端侧;复杂的、需要大数据的计算放云端。

第二,实时性和成本要平衡。要做到极低的延迟,需要大量的边缘节点和计算资源,成本很高。要在用户体验和成本之间找到平衡点,不是所有功能都需要极致的低延迟。

第三,可扩展性很重要。AR眼镜还在发展初期,用户量和功能都会快速增长。架构设计要考虑可扩展性,方便以后增加新功能、支持更多用户。不要一开始就过度设计,但也不要设计得太死,以后没法扩展。

第四,稳定性比新功能重要。AR眼镜是用户戴着的设备,系统稳定是第一位的。一个经常崩溃、经常出问题的系统,功能再丰富也没用。要把稳定性放在首位,在保证稳定的前提下,再迭代新功能。

第五,数据安全不能忽视。AR眼镜采集的数据非常敏感,一旦泄露,后果很严重。从架构设计的一开始,就要把数据安全和隐私保护考虑进去,而不是事后补救。

写在最后

AR眼镜是一个很有前景的方向,但也是一个挑战很大的领域。它的架构设计,和传统的互联网应用有很大的不同,需要考虑实时性、高可用、高并发、端云协同、数据安全等多个方面。

我们的架构还在不断演进和优化中,还有很多问题需要解决。但我相信,随着技术的发展和经验的积累,AR眼镜的系统会越来越成熟、越来越稳定。

希望这篇文章能给做AR或者类似可穿戴设备的朋友一些参考。如果你也有相关的架构经验,欢迎在评论区交流。