阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
函数计算FC,每月15万CU 3个月
简介: SAE 事件中心通过智能诊断显示通知与用户连接起来,SAE WEB 百毫秒弹性实例给事件中心带来了新的实时性、海量数据和高吞吐的挑战,本篇将带您了解 SAE 整体事件中心的架构和挑战。

作者:胡志广(独鳌)


背景


Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件,这个事件是 K8s 原生的事件,其实绝大多数的用户并不会关心,同时也可能看不懂。而事件中心,是希望能够成为一个更高维度入口,可以总览全局的事件(着重于异常事件),并且配置相关的通知与告警。


建设事件中心和监控最大的区别在于:


  • 监控:监控主要在关注异常指标的监控告警和可观测能力上。
  • 事件中心:主要是系统进行诊断抽象后面向用户更紧急和具体定位的事件可以让用户进行一键订阅和提前告警,面向智能运维的方向进行建设。


事件中心的核心意义在于通过显示、通知来将 SAE 上的应用与用户更紧密的连接起来。


事件中心整体能力大图如下:

image.png

SAE Web 上线后对于用户的事件需求更加的敏感,因为 Web 支持百毫秒弹性,所以对于事件的实时性和可靠性的要求更高,对于用户的通知和告警消息感知也更重要,针对这些需求 SAE 针对 Web 进行开发了事件中心让用户可以更好的感知异常事件。


整体架构

image.png

  • 资源服务
  • K8s:针对 K8s 的原始事件等各种记录入库,包括 pod、workload、网络等。
  • 极速系统:主要是针对 Web 的场景开发的百毫秒资源服务,实时性和弹性高,这里主要将实例信息、版本切换事件原始信息入库。
  • 事件中心
  • 事件消费:主要实时消费日志库中的原始数据进行监听。
  • 事件诊断:原始数据量过大冗余信息也多,所以需要事件诊断进行数据清洗和把中间数据写入 cache 临时保存。
  • 事件生成:数据诊断完成后,根据固定的事件模型写入到事件库保存。
  • 事件消息规则订阅:根据用户订阅的规则将生成好的事件通过消息通知服务进行告警通知,包括:钉钉、短信、邮件等。


技术挑战


技术选型

  • 全新实现一套 SAE Web 事件架构
  • 优点:历史包袱小,实现更优雅。
  • 缺点:研发周期长和之前的前后端需要兼容。
  • 基于 SAE 微服务事件架构实现
  • 优点:事件模型是现成的,实现简单和现有系统兼容。
  • 缺点:无法处理 Web 的海量数据,存在数据瓶颈。
  • 最终方案:事件模型采用 SAE 微服务事件中心架构实现写入,但是 Web 的事件不直接写入事件而是通过一层数据清洗后写入事件库避免信息爆炸。


数据爆炸

资源数据架构现状

image.png

微服务 K8s 资源架构

微服务 K8s 资源架构基于 K8s 基础之上建设的,所以对于 workload 和 pod 当资源异常状态的时候会重试非重建,所以 workload 的 key 和 pod 的 key 是唯一的,这时是不会造成事件信息的数据爆炸的,所以最终通过组件将原始事件信息写入到日志库中最终通过事件中心进行消费。


Web 极速系统资源架构

Web 是自主研发的一套极速系统可以实现百毫秒弹性实例的资源系统,可以通过流量控制弹性,闲置时进行缩容。


  • 实例资源:实例主要通过预留和弹性扩容的方式进行创建,一般通过流量控制弹性扩容,没有流量访问时则动态缩容。
  • 实例弹性扩容/缩容成功:扩容和资源闲置时进行缩容,除了预留资源是固定的 ID,其他的资源可能随时弹出和缩容,这里和微服务 K8s 架构固定实例的模式有很大差异,所以资源实例数据也会多很多。
  • 实例弹性扩容失败:当实例出现异常的时候(包括镜像拉取失败、健康检查失败、其他创建失败等原因),那么将会不断的进行重试,所以实例的 ID 也会变化,这时将会有很多的失败实例信息。
  • 版本切流:微服务 K8s 架构是根据 workload 进行部署发布,Web 是基于版本流量进行发布。
  • 版本切流成功:版本切流成功就是产生一条事件,这里主要会根据版本比例产生一些事件信息。
  • 版本切流失败:版本切流失败因为和实例弹性有关系,所以也受弹性实例失败影响,当弹性失败的时候版本切流同样也是失败会进行重试,并且版本切流还会存在部分成功和部分失败的场景,这种当面临同版本失败过多时也会存在信息爆炸的风险。
  • 数据爆炸风险:基于上述内容 Web 架构的实例会动态的扩容和缩容,失败的时候不断的重建实例造成 ID 会重建,包括版本失败的信息也和实例扩缩容有关系,所以资源的事件数据量要远远大于微服务 K8s 架构的事件数据。

解决方案

image.png

数据爆炸解决方案:通过分布式缓存进行数据聚合,根据时间阈值后进行事件生成,其实类似一种数据队列的模式。


  • key:应用 ID+版本 ID+事件类型,如:app1_version1_scaleUpSuccess。
  • 事件消费+初始化缓存:消费原始日志后判断事件 key 是否在缓存中,如果不在缓存中则调用 init 函数初始化 cache 数据,初始化 count:1 和 instanceId:1,如果失败的则不存在 InstanceId。
  • 事件消费+更新缓存:消费原始日志后如果事件 key 在缓存中则将缓存数据进行更新 count 和 instanceId 进行聚合,如:count2,instanceIds:id1,id2 这样(之前只有 id1),以此类推。
  • 事件生成:根据时间阈值定时出队,比如 60s 后,如果 key 内的 createtime 超过 60s 则调用 remove 方法删除缓存事件生成到标准的 sae 事件库中按照格式。


数据爆炸最初用的缓存方案,但是没有采用分布式锁,所以出现了事件中心管控多任务实例造成了同一个事件写入重复多份的问题,下面有问题和优化方案。


  • 问题:最初只是在内存中保存,所以当多实例时每个实例都会写入到事件库就会存在数据冗余。
  • 优化方案:队列采用分布式锁的方式处理,避免多实例重复写入事件的问题。

image.png

Full Gc

问题:因为基于微服务事件中心架构的模型是 java,最初是一次性获取缓存中所有的事件记录写到一个 Java 的 HashMap 中,而这一个 hashmap 有几百兆,如果在事件生成时比较慢会有多个线程都进行拉取就会造成上一个对象没回收下一个线程又获取了一个新的对象,这样就很容易 full gc 了,问题的监控图如下:

image.png

优化:

  • 这个问题其实是有 2 个问题:
  • 早期不是所有的事件类型都是类似队列的模式进行处理,就是入队和阈值出队的模式,所以某个事件异常后就会产生数据爆炸。
  • 一次性拉取缓存所有的数据设置到 Java 的 hashmap,数据量过大如果处理慢则会造成变量一直在函数内没有释放容器造成内存泄露和触发 full gc。
  • 优化内容:
  • 优化一:所有的事件类型都采用入队和出队的模式进行处理,这样可以降低很多数据积压,到达阈值后都会进行事件写入和去重。
  • 优化二:对于拉取缓存的数据进行分布式分片处理让整体的数据变小,比如 1/20 的数据量相对之前几百兆就缩小 20 倍,这样内存就直接下降了处理速度也快可以完美解决 full gc 问题。
  • 优化后的效果图如下:

image.png

image.png


未来和展望


因为面向资源的原始事件相对于 SAE 的用户来讲太难理解了,所以事件中心的出现是更简单的帮助用户进行诊断和定位问题并且第一时间进行通知更加及时的定位问题根据事件,目前很多用户基于 SAE 的事件中心发现问题并诊断自闭环,比如南瓜电影、迅捷联动等用户。


事件中心不仅仅提供白屏化和可订阅通知能力,还可以和用户的运维系统进行定制化集成起来,如:南瓜电影将事件中心集成到了运维平台。


未来计划在事件中心上丰富更多的诊断和智能运维事件结合 AI 场景进行分析和定位让用户可以精确锁定问题和快速处理,实现真正一键定位和简单运维。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
缓存 NoSQL 数据库
高性能Web服务器架构设计
【8月更文第28天】在当今互联网时代,网站的响应速度直接影响用户体验和业务成功率。因此,构建一个高性能的Web服务器架构至关重要。本文将从硬件配置、软件架构以及网络设置三个方面探讨如何提高Web服务器的性能,并提供一些实际的代码示例。
80 0
|
23天前
|
Cloud Native Java 编译器
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
随着云计算技术的不断发展,云服务商们不断推出高性能、高可用的云服务器实例,以满足企业日益增长的计算需求。阿里云推出的倚天实例,凭借其基于ARM架构的倚天710处理器,提供了卓越的计算能力和能效比,特别适用于云原生、高性能计算等场景。然而,有的用户需要将传统基于x86平台的应用迁移到倚天实例上,本文将介绍如何将基于x86架构平台的应用迁移到阿里云倚天实例的服务器上,帮助开发者和企业用户顺利完成迁移工作,享受更高效、更经济的云服务。
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
|
9天前
|
运维 安全 网络安全
Web安全-企业网络架构
Web安全-企业网络架构
15 1
|
10天前
|
存储 运维 监控
降本 60%!小熊油耗使用阿里云 SAE 更加稳定可靠
小熊油耗在进行架构升级时,进行了广泛的市场调研,深入分析了国内多家云服务商。经过对比多种 IaaS 层云主机方案及 Serverless 产品的部署策略,他们最终选择了阿里云Serverless 应用引擎 SAE。小熊油耗认为,阿里云能给他们提供更强的安全感,安全感来自于阿里云是一个更大的平台:历史最悠久,用户最多、产品最丰富、配套工具众多、技术支持体系成熟,阿里云 SAE,不仅在稳定性上表现卓越,在细粒度的成本控制和极致的弹性能力上表现也非常出色,而且免运维,完美契合了小熊油耗作为一家细分领域小而美的公司的需求。
|
28天前
|
前端开发 安全 JavaScript
构建高效Web应用:前后端分离架构的实践
【9月更文挑战第4天】在数字时代,Web应用已成为企业与用户互动的主要平台。本文将介绍如何通过前后端分离的架构设计来构建高效的Web应用,探讨该架构的优势,并分享实现过程中的关键步骤和注意事项。文章旨在为开发者提供一种清晰、高效的开发模式,帮助其在快速变化的市场环境中保持竞争力。
|
1月前
|
设计模式 存储 SQL
在web框架中实现解释器架构
【9月更文挑战第3天】解释器架构风格基于解释器设计模式,通过将问题建模为特定语言或指令集并逐条解析执行。然而,解释器风格也可能面临性能问题和扩展性限制。
24 1
|
2月前
|
开发者 Java
Play Framework深度解析:依赖注入的神秘力量,如何助力Web应用架构优化?答案即将揭晓!
【8月更文挑战第31天】依赖注入(DI)是现代软件开发的关键技术,用于分离对象创建与依赖关系,提升代码的可维护性和可测试性。Play Framework是一款高性能Java Web框架,内置了基于Google Guice的DI支持。本文探讨Play Framework中DI的最佳实践,包括定义组件、构造函数注入、字段注入以及作用域控制和自定义绑定等高级特性,帮助开发者轻松构建结构清晰、可维护性高的Web应用。
35 0
|
2月前
|
存储 前端开发 数据库
神秘编程世界惊现强大架构!Web2py 的 MVC 究竟隐藏着怎样的神奇魔力?带你探索实际应用之谜!
【8月更文挑战第31天】在现代 Web 开发中,MVC(Model-View-Controller)架构被广泛应用,将应用程序分为模型、视图和控制器三个部分,有助于提高代码的可维护性、可扩展性和可测试性。Web2py 是一个采用 MVC 架构的 Python Web 框架,其中模型处理数据和业务逻辑,视图负责呈现数据给用户,控制器则协调模型和视图之间的交互。
28 0
|
2月前
|
前端开发 JavaScript 微服务
探索现代Web开发中的微前端架构
在今天的Web开发世界,应用程序的复杂性与日俱增,传统的单体前端架构已经难以满足日益增长的需求。微前端架构应运而生,成为解决大型应用开发和维护挑战的一种有效方式。本文深入探讨微前端的核心概念、优缺点,以及如何在实际项目中应用这种架构,助力团队更好地应对复杂的前端开发需求。
|
20天前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
41 8
只需四步,轻松开发三维模型Web应用

相关产品

  • Serverless 应用引擎
  • 下一篇
    无影云桌面