当前位置: 首页 > news >正文

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

作者:胡志广(独鳌)

背景

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

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

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

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

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

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

整体架构

  • 资源服务

    • K8s:针对 K8s 的原始事件等各种记录入库,包括 pod、workload、网络等。
    • 极速系统:主要是针对 Web 的场景开发的百毫秒资源服务,实时性和弹性高,这里主要将实例信息、版本切换事件原始信息入库。
  • 事件中心

    • 事件消费:主要实时消费日志库中的原始数据进行监听。
    • 事件诊断:原始数据量过大冗余信息也多,所以需要事件诊断进行数据清洗和把中间数据写入 cache 临时保存。
    • 事件生成:数据诊断完成后,根据固定的事件模型写入到事件库保存。
    • 事件消息规则订阅:根据用户订阅的规则将生成好的事件通过消息通知服务进行告警通知,包括:钉钉、短信、邮件等。

技术挑战

技术选型

  • 全新实现一套 SAE Web 事件架构

    • 优点:历史包袱小,实现更优雅。
    • 缺点:研发周期长和之前的前后端需要兼容。
  • 基于 SAE 微服务事件架构实现

    • 优点:事件模型是现成的,实现简单和现有系统兼容。
    • 缺点:无法处理 Web 的海量数据,存在数据瓶颈。
  • 最终方案: 事件模型采用 SAE 微服务事件中心架构实现写入,但是 Web 的事件不直接写入事件而是通过一层数据清洗后写入事件库避免信息爆炸。

数据爆炸

资源数据架构现状

微服务 K8s 资源架构

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

Web 极速系统资源架构

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

  • 实例资源: 实例主要通过预留和弹性扩容的方式进行创建,一般通过流量控制弹性扩容,没有流量访问时则动态缩容。

    • 实例弹性扩容/缩容成功:扩容和资源闲置时进行缩容,除了预留资源是固定的 ID,其他的资源可能随时弹出和缩容,这里和微服务 K8s 架构固定实例的模式有很大差异,所以资源实例数据也会多很多。
    • 实例弹性扩容失败:当实例出现异常的时候(包括镜像拉取失败、健康检查失败、其他创建失败等原因),那么将会不断的进行重试,所以实例的 ID 也会变化,这时将会有很多的失败实例信息。
  • 版本切流: 微服务 K8s 架构是根据 workload 进行部署发布,Web 是基于版本流量进行发布。

    • 版本切流成功:版本切流成功就是产生一条事件,这里主要会根据版本比例产生一些事件信息。
    • 版本切流失败:版本切流失败因为和实例弹性有关系,所以也受弹性实例失败影响,当弹性失败的时候版本切流同样也是失败会进行重试,并且版本切流还会存在部分成功和部分失败的场景,这种当面临同版本失败过多时也会存在信息爆炸的风险。
  • 数据爆炸风险: 基于上述内容 Web 架构的实例会动态的扩容和缩容,失败的时候不断的重建实例造成 ID 会重建,包括版本失败的信息也和实例扩缩容有关系,所以资源的事件数据量要远远大于微服务 K8s 架构的事件数据。

解决方案

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

  • 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 事件库中按照格式。

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

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

Full Gc

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

优化:

  • 这个问题其实是有 2 个问题:

    • 早期不是所有的事件类型都是类似队列的模式进行处理,就是入队和阈值出队的模式,所以某个事件异常后就会产生数据爆炸。
    • 一次性拉取缓存所有的数据设置到 Java 的 hashmap,数据量过大如果处理慢则会造成变量一直在函数内没有释放容器造成内存泄露和触发 full gc。
  • 优化内容:

    • 优化一:所有的事件类型都采用入队和出队的模式进行处理,这样可以降低很多数据积压,到达阈值后都会进行事件写入和去重。
    • 优化二:对于拉取缓存的数据进行分布式分片处理让整体的数据变小,比如 1/20 的数据量相对之前几百兆就缩小 20 倍,这样内存就直接下降了处理速度也快可以完美解决 full gc 问题。
    • 优化后的效果图如下:

未来和展望

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

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

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

相关文章:

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

作者:胡志广(独鳌) 背景 Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件,这个事件是 K8s 原生的事件,其实绝大多数的用户并不会关心,同时也可能看不懂。而事件中心,是希望能够…...

人口普查管理系统基于VUE+SpringBoot+Spring+SpringMVC+MyBatis开发设计与实现

目录 1. 系统概述 2. 系统架构设计 3. 技术实现细节 3.1 前端实现 3.2 后端实现 3.3 数据库设计 4. 安全性设计 5. 效果展示 ​编辑​编辑 6. 测试与部署 7. 示例代码 8. 结论与展望 一个基于 Vue Spring Boot Spring Spring MVC MyBatis 的人口普查管理…...

使用VBA快速将文本转换为Word表格

Word提供了一个强大的文本转表格的功能,结合VBA可以实现文本快速转换表格。 示例文档如下所示。 现在需要将上述文档内容转换为如下格式的表格,表格内容的起始标志为。 示例代码如下。 Sub SearchTab()Application.DefaultTableSeparator "*&quo…...

力扣题解1870

这道题是一个典型的算法题,涉及计算在限制的时间内列车速度的最小值。这是一个优化问题,通常需要使用二分查找来求解。 题目描述(中等) 准时到达的列车最小时速 给你一个浮点数 hour ,表示你到达办公室可用的总通勤时…...

D3.js数据可视化基础——基于Notepad++、IDEA前端开发

实验:D3.js数据可视化基础 1、实验名称 D3数据可视化基础 2、实验目的 熟悉D3数据可视化的使用方法。 3、实验原理 D3 的全称是(Data-Driven Documents),是一个被数据驱动的文档,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的。本次实…...

在Robot Framework中Run Keyword If的用法

基本用法使用 ELSE使用 ELSE IF使用内置变量使用Python表达式本文永久更新地址: 在Robot Framework中,Run Keyword If 是一个条件执行的关键字,它允许根据某个条件来决定是否执行某个关键字。下面是 Run Keyword If 的基本用法: Run Keyword…...

虚拟机ip突然看不了了

打印大致如下: 解决办法 如果您发现虚拟机的IP地址与主机不在同一网段,可以采取的措施之一是调整网络设置。将虚拟机的网络模式更改为桥接模式,这样它就会获得与主机相同的IP地址,从而处于同一网段。或者,您可以使用…...

LeetCode[中等] 763. 划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 思路 贪心…...

Java LeetCode每日一题

997. 找到小镇的法官 package JavaExercise20241002;public class JavaExercise {public static void main(String[] args) {int[][] array {{1,3},{2,3},{3,1}};Solution solution new Solution();System.out.println(solution.findJudge(3, array));} }class Solution {pu…...

数据结构--集合框架

目录 1. 什么是集合框架 2. 背后所涉及的数据结构以及算法 2.1 什么是数据结构 2.2 容器背后对应的数据结构 1. 什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 int…...

Win10鼠标总是频繁自动失去焦点-非常有效-重启之后立竿见影

针对Win10鼠标频繁自动失去焦点的问题,可以尝试以下解决方案: 一、修改注册表(最有效的方法-重启之后立竿见影) 打开注册表编辑器: 按下WindowsR组合键,打开运行窗口。在运行窗口中输入“regedit”&#x…...

智能涌现|迎接智能时代,算力产业重构未来

前言 OpenAI首席执行官山姆奥特曼在《智能时代》中描绘了一个令人振奋的未来图景,其中算力产业将扮演至关重要的角色。奥特曼预测,我们可能在“几千天内”迎来超级智能,这一进程将极大加速社会结构的智能化转型。 这一预测与算力产业的未来…...

关于HTML 案例_个人简历展示01

案例效果展示 代码 <!DOCTYPE html> <lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>个人简历信息</title> </he…...

【前端开发入门】css快速入门

目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…...

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式&#xff08;List&#xff0c;Set&#xff0c;Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…...

D25【 python 接口自动化学习】- python 基础之判断与循环

day25 for 循环 学习日期&#xff1a;20241002 学习目标&#xff1a;判断与循环&#xfe63;-35 for 循环&#xff1a;如何遍历一个对象里的所有元素&#xff1f; 学习笔记&#xff1a; for 循环与while循环的区别 for循环的定义 使用for循环遍历序列 使用for循环遍历字典…...

HTTP1.0和HTTP1.1有什么区别

HTTP/1.0 和 HTTP/1.1 是两个不同版本的 HTTP 协议。虽然它们的核心功能都是提供网页数据传输&#xff0c;但 HTTP/1.1 对 HTTP/1.0 做了很多改进&#xff0c;提升了性能和灵活性。以下是它们的主要区别&#xff1a; 1. 持久连接&#xff08;Persistent Connection&#xff09…...

卡夫卡的理解

一、架构理解 在这个单聊新架构中&#xff0c;涉及多个服务器组件共同协作来实现单聊功能。 ChatAccessServer&#xff1a;可能负责处理单聊相关的访问请求&#xff0c;比如用户登录单聊以及发送单消息的请求接入。ChatHttpPushServer&#xff1a;推测其用于通过 HTTP 协议推…...

基础算法之滑动窗口--Java实现(上)--LeetCode题解:长度最小的子数组-无重复字符的子串-最大连续1的个数III-将x减到0的最小操作数

这里是Thembefue 今天讲解算法中较为经典的一个算法 > 滑动窗口 本讲解主要通过题目来讲解以理解算法 讲解分为三部分&#xff1a;题目解析 > 算法讲解 > 编写代码 滑动窗口 在正式进入题目的讲解之前&#xff0c;得先了解一下什么是滑动窗口&#xff0c;以及应该在什…...

Linux -- 文件系统(文件在磁盘中的存储)

目录 前言&#xff1a; 了解机械磁盘 初始盘片与磁头 盘片是怎么存数据的呢&#xff1f; 详解盘片 如何访问磁盘中的一个扇区呢&#xff1f; -- CHS 定位法 磁盘的逻辑存储 LBA&#xff08;Logical Block Addressing --- 逻辑块寻址&#xff09; 如何将 LBA 地址转换为…...

微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍

文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…...

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 &#x1f4af;ChatGPT的数据使用特点ChatGPT数据安全…...

什么是区块链桥?

什么是区块链桥&#xff1f; 区块链桥是一种实现资产从一个区块链转移至另一个区块链的工具&#xff0c;它解决了区块链技术中不同网络之间缺乏互操作性的问题。区块链桥通过创建代表另一区块链资产的合成衍生品&#xff0c;使得原本互不兼容的区块链资产能够相互连接和转移。…...

机器学习框架

机器学习框架 机器学习框架是用于开发和部署机器学习模型的软件工具。它们提供了一组API和工具&#xff0c;帮助开发人员在各种计算设备上构建、训练和部署机器学习模型。以下是几个常见的机器学习框架&#xff1a; 1.TensorFlow&#xff1a; TensorFlow是一个开源的人工智能…...

金三银四:20道前端手写面试题

文章目录 一、前言二、题目1. 防抖节流解读 2.一个正则题3. 不使用a标签&#xff0c;如何实现a标签的功能4. 不使用循环API 来删除数组中指定位置的元素&#xff08;如&#xff1a;删除第三位&#xff09; 写越多越好5. 深拷贝解读 6. 手写call bind applycall 解读apply 解读 …...

RAC被修改权限及相关问题

RDBMS &#xff1a; 19.19 修改RAC权限及相关问题 修改RAC权限&#xff0c;参考文档&#xff1a; How to check and fix file permissions on Grid Infrastructure environment (Doc ID 1931142.1) Script to capture and restore file permission in a directory (for eg. O…...

Golang | Leetcode Golang题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }...

数学建模--什么是数学建模?数学建模应该怎么准备?

前言 这是去年底学数学建模老哥的建模课程笔记&#xff1b;未来本人将陆陆续续的更新数学建模相关的一些基础算法&#xff0c;大家可以持续关注一下&#xff1b;提示&#xff1a;数学建模只有实战才能提升&#xff0c;光学算法没有啥意义&#xff0c;也很难学的很懂。 文章目录…...

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着电商行业的蓬勃发展&#xff0c;物流行业迎来了前所未有的机遇与挑战。面对日益增长的订单量和复…...

【数据分享】2000—2023年我国省市县三级逐月植被覆盖度(FVC)数值(Shp/Excel格式)

之前我们分享过2000—2023年我国250米分辨率逐月植被覆盖度&#xff08;FVC&#xff09;栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;该数据来源于高吉喜等学者在国家青藏高原科学数据中心平台上分享的数据&#xff0c;合成方式采用月最大值合成&…...

给人做赌博网站犯法嘛/seo秘籍优化课程

date: 2016-07-12 21:31:24 说明 2016年7月15更新&#xff0c;最近试了一下&#xff0c;发现用nc拿不到数据了&#xff0c;拿数据的代码是没有问题的&#xff0c;直接运行可以拿到数据&#xff0c;但是从mac通过IP和端口拿到的.sqlitedb文件是空文件&#xff0c;博主也正在看为…...

开网站做代销好/品牌推广平台

我的Swing登录页面包含userName和密码以及一个Submit按钮。我需要将用户名和密码传递给LoginAction servlet&#xff0c;并且需要通过servlet在控制台中获取userName和密码。我的Swing代码是&#xff0c;package com.tps.SwingChat.login;import javax.swing.*;import org.apac…...

宁都县建设局网站/网站收录查询网

转自&#xff1a;MySQL (MariaDB) 数据库常用简单语法归纳一、数据库的操作1 1 列出所有数据库SHOW DATABASES;1 2 新建一个数据库CREATE DATABASE ;1 3 删除一个数据库DROP DATABASE ;1 4 选择一个数据库进https://www.pinlue.com/article/2019/04/0607/288549054750.html...

给赌博网站做推广/网站排名优化查询

Android知识图谱。快来看看哪方面有漏洞&#xff1f;该图转自&#xff1a;http://blog.csdn.net/xyz_lmn/article/details/41411355转载于:https://www.cnblogs.com/zsychanpin/p/7273430.html...

分类信息网站成都搭建/五年级上册优化设计答案

很多学校是使用校园一卡通作为老师学生的身份标识&#xff0c;进行进出学校、消费、借还书籍等操作&#xff0c;但实体卡片容易忘带、丢失、磨损、补办、冒用等问题。如今&#xff0c;可通过人脸识别系统解决校园卡使用过程的弊端&#xff0c;那应用人脸识别测温一体机&#xf…...

学会python做网站/在线教育

【前言】树的遍历&#xff0c;根据访问自身和其子节点之间的顺序关系&#xff0c;分为前序&#xff0c;后序遍历。对于二叉树&#xff0c;每个节点至多有两个子节点&#xff08;特别的称为左&#xff0c;右子节点&#xff09;&#xff0c;又有中序遍历。由于树自身具有的递归性…...