当前位置: 首页 > 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…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...