FA13# 服务治理中的强弱依赖知识点梳理

引言

为什么要梳理服务之间的强弱依赖,有哪些作用和意义?有哪些方式能识别这些强弱依赖,本文主要内容有:

  • 强弱依赖及其作用

  • 治理强弱依赖措施

  • 针对服务划分等级

  • 强弱依赖自动感知

一、强弱依赖及其作用

1.强弱依赖含义

服务之间的依赖: 当前互联网公司以微服务架构为主,微服务之间的上下游调用形成服务之间的依赖。

强依赖: 服务A调用服务B,B服务出现故障时A服务也不可用

弱依赖: 服务A调用服务B,B服务出现故障时A服务仍然可用

2.强弱依赖作用

梳理强弱依赖主要是保障核心服务的稳定性 ,避免由于弱依赖服务故障对核心服务造成拖累。尽管我们在服务发布时也常常需要考虑服务之间的依赖,先发下游服务(服务提供者),再发上游服务(服务消费者)。

处理服务发布时的依赖关系,通常有以下几种方式:

  • 通过发布计划,发布计划要求梳理服务发布之间的依赖关系

  • 在功能设计时尽量避免服务之间的强依赖,如果无法避免,可以通过开关来处理

  • 通过蓝绿发布等方式避免服务发布之间的依赖关系

二、治理强弱依赖措施

1.熔断限流措施

1.1 核心服务调用非核心服务
  • 在非核心服务侧配置熔断降级,避免由于非核心服务产生慢调用拖垮核心服务。

  • 常用的熔断维度有:慢调用比例、异常数比例、异常数

  • 熔断实现通过断路器实现

1.2 非核心服务调用核心服务

  • 通过核心服务配置限流,避免由于非核心服务流量过大对核心服务造成冲击

  • 常用的限流措施:单机限流、集群限流、针对调用来源的限流

  • 限流实现原理:令牌桶、漏桶

29bcff5fe76aa073fcdb5c3e361af8a9.png

2.服务分组措施

如下图所示,将核心服务B部署在三个不同的分组中:

  • 核心服务A调用核心服务B在分组一进行

  • 核心服务B调用非核心服务E配置了熔断措施

  • 非核心服务E调用核心服务B在分组二进行

  • 核心服务C调用核心服务B在分组三进行

2339227bd82bb3b648cc5edc8d3246bd.png

三、针对服务划分等级

1.强弱依赖前提

对服务的等级划分是强弱依赖的前提,否则我们将无法识别哪些是核心服务,哪些是非核心服务。针对强弱依赖的治理措施也就无法排上用场。

2.服务等级划分

在进行服务等级划分时,首先应该考虑划分的标准是什么?在考虑划分标准时须能够量化,避免模棱两可。发展故障时往往给用户带来影响、给公司带来资损。

发生故障时可以从受影响的用户数量、给公司造成资产损失两个维度进行划分。具体用户数量、资产损失多少,根据公司实际情况予以确定。

核心服务: 故障发生时造成公司较大资损(具体资损金额范围)或者用户大面积(受影响的用户数范围)无法使用,例如:交易支付服务。

重要服务: 故障发生不直接引起公司资损,不影响用户的整体体验,但是影响核心服务的排查效率和辅助决策能力,例如:监控告警服务。

辅助服务: 故障发生对用户使用情况和资产损失没有影响,例如:内部管理系统。

四、强弱依赖自动感知

1.强弱依赖人工梳理

通过走查服务代码核心逻辑,识别哪些链路接口是核心服务,哪些是非核心链路。针对这些非核心链路逻辑能够拆分到非核心服务中去。针对非核心链路可以配置降级措施。

2.故障演练自动感知

通过对依赖接口注入故障,判断对核心链路的影响,原理如下:

f841033c84a22f756a909e87209355c2.png

  • 步骤1:为选定服务或接口拉取依赖关系

  • 步骤2:为接口依赖设置预判预期

  • 步骤3:为依赖接口注入故障并引入流量

  • 步骤4:监控指标并观测影响

  • 步骤5:强弱依赖结果判定

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请问你需要的是对于一段给定的cds.fa文件,找出其包含的最长的转录本吗? 如果是的话,可以使用以下的Python脚本来完成这个任务: ```python # 利用python自带的sys和os模块来读取和处理文件 import sys import os # 通过sys.argv获取命令行传递的参数 filename = sys.argv[1] # 读取cds.fa文件的所有内容 with open(filename, 'r') as file: raw_data = file.read() # 将文件分割成一行一行的 lines = raw_data.split('\n') # 获取所有序列的名称和对应的序列内容 seqs = {} name = '' for line in lines: if line.startswith('>'): name = line[1:] seqs[name] = '' else: seqs[name] += line # 对于每一条序列,计算出其最长的转录本长度 longest_transcript_length = 0 longest_transcript_name = '' for name, seq in seqs.items(): transcript_lengths = [] start_codon_index = seq.find('ATG') while start_codon_index != -1: transcript_end_index = seq.find('TAG', start_codon_index) # 寻找一个TAG为止 if transcript_end_index == -1: # 没有找到TAG符号,跳出循环 break transcript_lengths.append(transcript_end_index - start_codon_index + 3) # 计算转录本长度 start_codon_index = seq.find('ATG', start_codon_index + 1) # 找到下一个ATG开始查找下一个转录本 # 获取最长的转录本 if transcript_lengths: longest_transcript_length_for_this_seq = max(transcript_lengths) if longest_transcript_length_for_this_seq > longest_transcript_length: longest_transcript_length = longest_transcript_length_for_this_seq longest_transcript_name = name # 输出最长转录本的名称和长度 print(f"The longest transcript in {filename} is {longest_transcript_name} with length {longest_transcript_length}") ``` 将以上代码保存为`find_longest_transcript.py`,然后在命令行执行以下命令: ``` python find_longest_transcript.py cds.fa ``` 其,`cds.fa`是你需要处理的文件名。这个脚本会输出格式为`The longest transcript in {filename} is {sequence_name} with length {length}` 的字符串,其`{filename}`是输入文件名,`{sequence_name}`是最长转录本的名称,`{length}`是转录本的长度。 该脚本会从给定的cds.fa文件读取所有序列的名称和对应的序列内容,并且对于每一条序列,它会计算出其最长的转录本的长度和名称,然后输出最长转录本的名称和长度。它并不依赖于任何模块,因此可以在几乎所有Python环境运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值