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

小研究 - 微服务系统服务依赖发现技术综述(二)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确地定位与诊断, 对微服务架构系统的智能运维提出了挑战. 服务依赖发现技术从系统运行时数据中识别并推断服务之间的调用依赖关系或逻辑依赖关系, 构建服务依赖关系图, 有助于在系统运行时及时、精准地发现与定位故障并诊断根因, 也有利于如资源调度、变更管理等智能运维需求. 首先就微服务系统中服务依赖发现问题进行分析, 其次, 从基于监控数据、系统日志数据、追踪数据等 3 类运行时数据的角度总结分析了服务依赖发现技术的技术现状; 然后, 以基于服务依赖关系图的故障根因定位、资源调度与变更管理等为例, 讨论了服务依赖发现技术应用于智能运维的相关研究. 最后, 对服务依赖发现技术如何准确地发现调用依赖关系和逻辑依赖关系, 如何利用服务依赖关系图进行变更治理进行了探讨并对未来的研究方向进行了展望.

目录

3 服务依赖图的关键应用

3.1 基于服务依赖图的故障根因定位

3.2 基于服务依赖图的资源调度

3.3 基于服务依赖图的变更治理

4 工程实践应用

5 服务依赖发现技术展望

6 结束语


3 服务依赖图的关键应用

服务依赖关系图对于提高微服务架构软件系统的运维效率具有重要意义, 能够帮助开发与运维人员高效、精准地发现与定位系统中的故障并进行根因分析, 制定高效的资源调度策略以保证微服务架构系统的端到端 SLA (service level agreement), 以及用于包括故障预防、部署规划和异常检测等在内的变更治理.本节重点介绍基于服务依赖关系图的故障根因定位、资源调度和变更治理等研究工作.

3.1 基于服务依赖图的故障根因定位

随着微服务的发展, 服务间存在复杂的依赖关系, 一个请求往往会引起不同节点上若干服务的大量复杂的互操作. 同时, 这种复杂的依赖关系带来了故障的蔓延性和传播性, 单个服务的故障会在系统中迅速传播. 当某服务出现异常, 可能会级联地导致依赖该服务的其他服务的行为异常, 使得大量的服务失效. 这种跨节点、跨服务的故障传播会大大增加故障根因定位的难度, 降低故障根因定位的效率. 通过构建服务之间的依赖关系图, 在某个服务发生故障时, 可以快速精准地定位故障根因的位置并判断受影响的下游服务. 根据故障根因定位的方法不同, 基于服务依赖关系图的故障根因定位可以分为基于可视化、基于图搜索和基于随机游走方法.

服务依赖关系图已在故障根因定位领域得到了大量应用, 服务依赖关系图对服务之间的依赖关系进行刻画, 这种依赖关系反映了服务之间的故障传播, 从而有助于运维人员进行故障根因定位. 基于服务依赖关系图的故障根因定位首先通过指标、系统日志或追踪数据构造服务依赖关系图, 然后当异常发生时, 从服务依赖关系图中的异常节点出发, 通过图搜索、随机游走等算法得到候选故障根因, 然后通过异常分数、与异常节点的相关性或被访问次数等方式对候选故障根因进行排序. 相信未来会有更多研究工作提出结合服务依赖关系图的故障根因定位方法. 

3.2 基于服务依赖图的资源调度

基于服务依赖关系图的资源调度可以保证整个服务的 SLA 要求. 文献 [66] 提出一种基于机器学习的微服务资源管理框架. 该框架首先构造用于预测服务端到端延迟和 QoS 违反概率的机器学习模型, 然后使用该模型对资源分配进行预测, 在满足 QoS 的同时最大化资源效率. 文献指出资源调度需要考虑微服务之间的依赖性, 否则将导致低效的资源分配, 并且不一定有助于应对负载变化和保证服务性能. 因此, 该工作基于延迟从后端服务传播到前端服务的假设, 利用服务依赖关系图优先对后端微服务进行资源调度, 从而避免前端微服务不必要的资源调度. 从服务依赖关系图上识别关键路径, 并定位可能违反 SLA 的关键微服务实例, 基于关键微服务实例上的资源利用率、性能指标和工作负载特点, 通过强化学习对资源做出扩容或缩容的决策. 同样地, 基于服务依赖图, 提出一种基于梯度下降的资源调度算法, 则使用分层排队网络对微服务的性能建模, 通过遗传算法求解最优资源调度策略.

在资源调度领域, 服务依赖图精准刻画了服务/虚拟机之间的依赖关系, 有助于准确地分析服务性能以保证服务端到端 SLA.

3.3 基于服务依赖图的变更治理

在变更故障预防方面, 文献基于服务依赖对变更风险进行评估. 首先, 从网络依赖、组件调用等数据构造故障图, 故障图描述了从底层路由器、交换机等网络设备到上层服务的故障传播. 然后, 基于变更通常只会影响小部分服务的假设, 提出一种增量评估算法, 该算法复用已有的评估结果, 将变更风险评估问题转换为布尔可满足性 (SAT) 问题, 使用 SAT 求解器对差异故障图进行分析, 从而避免重新分析整个故障图. 最后, 如果待变更的故障图不满足可靠性目标, 则会根据提供的规则生成一组满足该目标的改进方案.

在变更治理领域, 服务依赖图主要应用于变更影响面的分析, 相信未来会有更多研究工作将服务依赖图应用于变更治理的其他方向. 

4 工程实践应用

如前文所述, 微服务系统依赖发现技术可分为基于监控数据的依赖发现, 基于系统日志的依赖发现和基于追踪数据的依赖发现. 目前产业界微服务依赖发现技术往往与数据采集和分析工具紧耦合, 通常作为其中的一个关键功能模块. 日志数据的采集和分析工具包括 Filebeat、Logstash、Flume 等开源工具. 其中, 以 ELK(Elasticsearch、Logstash 和 Kibana) 为代表的开源软件生态是业界主流的日志采集存储与分析的技术架构.此类软件在各个目标节点安装 agent 组件, 读取不同格式的日志数据, 并将数据发送到指定的位置, 收集微服务系统产生的系统日志数据, 然后基于统一标识、共现概率、日志频率等方法预测服务请求执行逻辑, 进而发现微服务实例和微服务依赖关系. Splunk 是业界日志数据采集和分析的代表性工具, 支持自定义丰富的日志分析方法,能够支持构造微服务发现应用.

5 服务依赖发现技术展望

表 1 从相关工作所使用的运行时数据的类型、期望发现的服务依赖关系、最终发现的是否为服务运行时数据之间的相关性、是否需要修改目标系统的源代码以及是否需要向软件系统中注入故障或者干扰 5 个角度对比分析了现有的服务依赖发现方法.

在拓展服务依赖发现技术的应用领域方面, 将服务依赖发现技术应用于系统变更风险感知和故障根因定位是一个关键发展趋势. 首先, 服务依赖发现技术能够监测整个变更周期中受变更影响的服务的运行情况, 预测变更可能引起的故障, 实现实时变更风险感知, 帮助运维人员动态调整变更灰度策略, 避免和降低变更造成的故障对业务的影响. 其次, 由于微服务间具有复杂的依赖关系, 发生故障的服务与导致故障的部署了变更的根因服务可能完全不同, 导致故障根因定位十分困难. 针对该问题, 在故障发生时, 基于服务依赖图采用图搜索、因果推断等技术, 可以找到与故障高度相关的变更, 辅助运维人员进行故障根因定位, 提升运维效率. 

6 结束语

服务依赖发现技术是准确地刻画微服务架构软件系统中各个微服务之间的复杂的依赖关系的重要手段, 对微服务架构软件系统中的故障定位、性能瓶颈分析、资源调度等一系列运维任务有重要意义, 其研究受到了工业界和学术界的广泛关注.本文从服务依赖发现的基本概念出发, 从 3 类不同的运行时数据的角度总结了已有的服务依赖发研究工作. 通过整理总结已有的服务依赖发现技术及其应用的相关工作, 进一步分析了服务依赖发现技术当前所面临的问题并对未来的研究方向进行了展望, 为相关研究人员开展下一步研究工作做出一些有价值的探索.

相关文章:

小研究 - 微服务系统服务依赖发现技术综述(二)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…...

javaee 泛型的上下边界和通配符的使用

下边界 package com.test.generic;import java.util.Collection;public class TestGenericClass {//泛型方法 ? extends E :泛型的限定public static <E> void move(Collection<E> from,Collection<? super E> to){for(E e:from){to.add(e);}}public st…...

【TypeScript】类型声明及应用(二)

【TypeScript】类型声明及应用&#xff08;二&#xff09; 一、前言 TypeScript开发中需要对定义的变量指定类型&#xff0c;目前版本都支持哪些类型&#xff0c;每一个类型都有哪些含义&#xff0c;在这篇文章中&#xff0c;我们将会对其进行总结说明 二、JavaScript基本数据…...

rust from_utf8_lossy怎么使用?

from_utf8_lossy 是Rust标准库中的一个方法&#xff0c;用于将字节序列解码为UTF-8字符串。它的作用是尽可能地将无效的字节序列转换为有效的Unicode字符&#xff0c;以便进行后续处理。 以下是使用 from_utf8_lossy 方法的示例代码&#xff1a; fn main() {let bytes b"…...

#P0997. [NOIP2006普及组] 数列

题目描述 给定一个正整数k(3≤k≤15)k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列&#xff0c;例如&#xff0c;当k3k3时&#xff0c;这个序列是&#xff1a; 1,3,4,9,10,12,13,…1,3,4,9,10,12,13,… &#xff08;该序列实际上就是&…...

做完两年外包,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…...

Kubernetes系列-Ingress

1 Ingress 概述 Kubernetes 对外暴露服务&#xff08;Service&#xff09;主要有两种方式&#xff1a;NodePort&#xff0c;LoadBalance&#xff0c;此外 externalIps 也可以使各类 service 对外提供服务&#xff0c;但是当集群服务很多的时候&#xff0c;NodePort方式最大的缺…...

软件测试之Docker常见问题汇总!附解决方法!

1、配置国内源进行docker安装&#xff0c;报错 HTTP Error 404 - Not Found 【整整200集】超超超详细的Python接口自动化测试进阶教程&#xff0c;真实模拟企业项目实战&#xff01;&#xff01; 原因&#xff1a; 由于配置国内镜像源时&#xff0c;把地址写错了&#xff0c;导…...

Python-操作Excel表-openpyxl模块使用

openpyxl简介 openpyxl是一个强大的Python库,用于读写Excel(xlsx/xlsm/xltx/xltm)文件。 主要功能和特点如下: 读取、修改、写入Excel文件,支持格式如xlsx、xlsm等支持 Excel 2003 以上格式可以很方便地遍历工作表中的行和列获取单元格对象后,可以修改单元格的值、样式、格式…...

向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录

1、注册https://issues.sonatype.org/账号 下面就代表注册好了&#xff0c;同时提交的工单也通过了 2、这里主要是goupId 需要进行认证&#xff0c;需要到域名注册商近一个txt的解析&#xff0c;以便确保这个是你的 通过下面来验证你的域名信息&#xff0c;这里主要是上面的工…...

【HDFS】Block、BlockInfo、BlockInfoContiguous、BlockInfoStriped的分析记录

本文主要介绍如下内容: 关于几个Block类之间的继承、实现关系;针对文章标题中的每个类,细化到每个成员去注释分析列出、并详细分析BlockInfo抽象类提供的抽象方法、非抽象方法的功能针对几个跟块组织结构的方法再进行分析。moveBlockToHead、listInsert、listRemove等。一、…...

STM32 LoRa(学习二)

LoRa关键参数说明 LoRa数据包由三个部分组成&#xff1a;前导码、可选报头、数据有效负载。 前导码&#xff1a;用于保持接收机与输入的数据流同步。默认情况下&#xff0c;数据包含有12个符号长度的前导码。前导码是一个可以通过编程来设置的变量&#xff0c;所以前导码的长度…...

ASP.NET Core学习路线图

说明 1. 先决条件 - [C#](https://www.pluralsight.com/paths/csharp) - [Entity Framework](https://www.pluralsight.com/search?qentity%20framework%20core) - [ASP.NET Core](https://www.pluralsight.com/search?qasp.net%20core) - SQL基础知识 2. 通用开发技能 -…...

无涯教程-Lua - for语句函数

for 循环是一种重复控制结构&#xff0c;可让您有效地编写需要执行特定次数的循环。 for loop - 语法 Lua编程语言中 for 循环的语法如下- for init,max/min value, increment dostatement(s) end 这是 for 循环中的控制流程- 首先执行 init 步骤&#xff0c;并且仅执行一…...

二叉树的相关题目

目录 1、根据二叉树创建字符串 2、二叉树的层序遍历 3、二叉树的最近公共祖先 4、搜索二叉树与双向链表 5、从前序与中序遍历序列构造二叉树 6、 从中序与后序遍历序列构造二叉树 7、二叉树的前序遍历&#xff08;非递归实现&#xff09; 8、二叉树的中序遍历&#xff08…...

【antd之tabs踩坑篇】Tabs有items时切换不起作用

<TabsdefaultActiveKey"1"tabPosition{mode}style{{ height: 220 }}items{new Array(30).fill(null).map((_, i) > {const id String(i);return {label: Tab-${id},key: id,disabled: i 28,children: Content of tab ${id},};})}/>官网上如果tabs有很多it…...

简单模拟livedata数据倒灌

简单模拟livedata数据倒灌 数据倒灌&#xff0c;就是将旧的或只展示一次的数据再次展现出来。 livedata内部通过版本号更新可见视图数据&#xff0c;而在view在活跃与不活跃之间反复横跳时&#xff0c;livedata也会通知数据。 class MainActivity : AppCompatActivity() {pri…...

python爬虫-加速乐cookie混淆解析实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;抓包工具第一次请求页面&#xff0c;得到响应。本次我使用的fiddle进行抓包&#…...

TensorFlow 中前缀 prefix

前缀 prefix 主要用于命名 TensorFlow 中的变量&#xff0c;以避免变量名冲突。在 TensorFlow 中&#xff0c;每个变量都有一个唯一的名称&#xff0c;由变量的作用域和变量的名称组成。作用域可以通过 tf.variable_scope() 函数来创建&#xff0c;而变量的名称通常是由用户指定…...

SystemVerilog scheduler

文章目录 简介调度器simulation regionPreponed regionActive regionInactive regionNBA(Non-blocking Assignment Events region)Observed regionReactive regionRe-Inactive Events regionRe-NBA RegionPostponed Region PLI region:Pre-active regionPre-NBA regionPost-NBA…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...