微服务架构介绍2

news/2024/6/17 3:40:50 标签: 架构, 微服务, java, golang

前言: \textcolor{Green}{前言:} 前言:

💞这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营
💞从这个专栏里面可以迅速获得Go的知识

微服务架构介绍2

  • 3 核心服务治理功能
    • 3.1 服务发布
    • 3.2 流量治理
    • 3.3 负载均衡
    • 3.4 稳定性治理
  • 4. 字节跳动服务治理实践
    • 4.1 重试的意义
    • 4.2 重试的难点
    • 4.3 重试策略
    • 4.4 重试效果验证

3 核心服务治理功能

3.1 服务发布

服务发布(deployment),即指让一个服务升级运行新的代码的过程。

服务发布的难点:

在这里插入图片描述

蓝绿部署

(1)需要准备两个相同的应用运行环境,命名为蓝色环境、绿色环境,刚开始,蓝色环境和绿色环境都运行着相同的应用版本,只有绿色环境对外提供服务。

(2)开发了一个新版本,那么放到蓝色环境上进行反复的测试、修改、验证,确定达到上线标准后,利用负载均衡器/反向代理/路由等手段将对外服务切换为蓝色环境。

(3)一段时间后,如果发生故障,那么迅速切换回绿色环境;如果运行没有异常,那么绿色环境更新版本到,版本再次一致。

(4)当需要开发下一个版本,重复前面的步骤,蓝色绿色相互切换相互备份。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
再次同样的步骤
在这里插入图片描述
在这里插入图片描述
蓝绿部署非常的简单、稳定。但是需要双倍的资源
在这里插入图片描述

灰度发布(金丝雀发布)

金丝雀(canary)对瓦斯极其敏感,17世纪时,英国矿工在下井前会先放入一只金丝雀,以确保矿井中没有瓦斯

回滚难度大,基础设施要求高

3.2 流量治理

微服务架构下,我们可以基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行精确控制。
在这里插入图片描述
用了多种分类进行区分。

这里指的是侠义的对流量进行控制

3.3 负载均衡

负载均衡(Load Balance)负责分配请求在每个下游实例上的分布

常见的 LB 策略

  • Round Robin
  • Random
  • Ring Hash
  • Least Request

  • 在这里插入图片描述

在这里插入图片描述
一个服务中,通常每个实例的负载应是大体均衡一致的。

3.4 稳定性治理

线上服务总是会出现问题的,这与程序的正确性无关。例如:

  • 网络攻击
  • 流量突增
  • 机房断电
  • 光纤被挖
  • 机器故障
  • 网络故障
  • 机房空调故障

微服务架构中典型的稳定性治理功能

  • 限流
  • 熔断
  • 过载保护
  • 降级
    在这里插入图片描述

4. 字节跳动服务治理实践

4.1 重试的意义

本地函数调用

func LocalFunc(x int) int {
    res := calculate(x - 2)
    return res
}

此时我们因本地函数嗲用发现

  • 参数非法
  • OOM(Out Of Memeory)
  • NPE(Null Pointer Exception)
  • 边界 case
  • 系统崩溃
  • 死循环
  • 程序异常退出

需要明白:本地函数调用没有重试的意义

远程函数调用

fun RemoteFunc(ctx context.Context, x int) (int, error) {
    ctx2, defer_func := context.WithTimeout(ctx, time.Second)
    defer defer_func()
    res, err := grpc_client.Calculate(ctx2, x - 2)
    return res, err
}

远程调用会的异常:

  • 网络抖动
  • 下载负载高导致超时
  • 下游机器宕机
  • 本地机器负载高,调度超时
  • 下游熔断、限流

重试可以避免偶发的错误,提高SLA(Service-Level Agreement)

fun RemoteFunc(ctx context.Context, x int) (int, error) {
    ctx2, defer_func := context.WithTimeout(ctx, time.Second)
    defer defer_func()
    res, err := grpc_client.Calculate(ctx2, x - 2)
    return res, err
}

fun RemoteFuncRetry(ctx context.Context, x int) (res int, err error) {
    for i := 0; i < 3; i++ {
        if res, err = RemoteFunc(ctx, x); err == nil {
            return
        }
    }
    return
}

此时我们就知道重试的意义

  • 降低错误率
    • 假设单次请求的错误概率为 0.01,那么连续两次错误概率为 0.0001。
  • 降低长尾延时
    • 对于偶尔耗时较长的请求,重试请求有机会提前返回。
  • 容忍暂时性错误
    • 某些时候系统会有暂时性异常(例如网络抖动),重试可以尽量规避。
  • 避开下游故障实例
    • 一个服务中可能会有少量实例故障(例如机器故障),重试其他实例可以成功。

4.2 重试的难点

既然重试的好处有很多,为什么默认不用呢?

这是因为:

  • 幂等性:多次请求可能导致数据不一致
  • 重试风暴:随着调用深度的增加,重试次数会指数级上涨
  • 超时设置:假设一个调用正常是 1s 的超时时间,如果允许一次重试。有个问题:如果第一次请求经过多少时间时,才开始重试呢?

重试风暴
在这里插入图片描述

4.3 重试策略

重试只有在大部分请求都成功,只有少量请求失败时,才有必要。如果大部分请求都失败,重试只会增加问题严重性。

  1. 限制重试比例
    设定一个重试比例阈值(例如 1%)。重试次数占所有请求比例不超过该阈值
    在这里插入图片描述

  2. 防止链路重试
    链路层面的防重试风暴的核心是限制每层都发生重试,理想情况下只有最下一层发生重试。可以返回特殊的 status 表明:“请求失败,但别重试”
    在这里插入图片描述
    缺点:对业务代码有侵入性

  3. Hedged requests
    对于可能超时(或延时高)的请求,重新向另一个下游实例发送一个相同的请求,并等待先到达的响应。
    在这里插入图片描述

4.4 重试效果验证

实际验证经过上述重试策略后,在链路上发生的重试放大效应。

在这里插入图片描述


http://www.niftyadmin.cn/n/477383.html

相关文章

软件测试缺陷报告详解

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report&#xff08;SBR&#xff09;或软件问题报告Software Problem Report&#xff08;SPR&#xff09; 作用&#xff1a;缺陷报告是软件测试人员的工作成果之一&#xff0c;体现软件测试的价值缺陷报…

Linux使用HTTP隧道代理模板

以下是一个使用HTTP隧道代理的Linux模板&#xff1a; 1. 首先&#xff0c;确保你已经安装了curl和socat工具。如果没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; sudo apt-get install curl socat 2. 创建一个名为proxy.sh的脚本文件&#xff0c;并将以下内容复制…

TFRecord :TensorFlow 数据集存储格式

TFRecord 可以理解为一系列序列化的 tf.train.Example 元素所组成的列表文件,而每一个 tf.train.Example 又由若干个 tf.train.Feature 的字典组成。 写入record 读取该数据元素到内存; 将该元素转换为 tf.train.Example 对象(每一个 tf.train.Example 由若干个 tf.train.Fe…

如何用低代码开发平台快速实现单据打印功能?

每家企业在日常工作中&#xff0c;业务流转时&#xff0c;都经常需要在线打印各种纸质文件&#xff0c;如凭证、采购单、出入库单据、销售合同等&#xff0c;不同企业都有个性化的排版要求&#xff0c;每一次需要在固定文档模板的基础上重新填充业务数据&#xff0c;过程中难免…

其实失败才是人生常态,赢者通吃确实存在,但那不代表绝大多数人。

其实失败才是人生常态&#xff0c;赢者通吃确实存在&#xff0c;但那不代表绝大多数人。 &#x1f4e2;今年的就业难度可能是之前5年最难的一年&#xff0c;也有可能是以后5年最好的一年。 &#x1f4e2;&#x1f4e2;疫情的回落&#xff0c;仿佛只带动了旅游业的发展&#x…

XGBOOST使用示例

回归例子 import xgboost as xgb from xgboost import plot_importance from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.datasets import load_boston from sklearn.metrics import mean_squared_error# 加载数据集…

如何充分利用制作游戏原型的免费资产,加速游戏开发

在一款电子游戏发布之前&#xff0c;它通常会经历多次迭代&#xff0c;以确保其核心机制和功能都能正常运行。在这个过程中&#xff0c;一个重要部分是电子游戏原型&#xff0c;它有助于测试游戏的各个方面。 在今年的《Unity Gaming报告》中有一个有趣的发现&#xff0c;在投…

问题杂谈(三十五)Linux中文乱码问题

前言&#xff1a; 如下&#xff0c;系统的中文描述是乱码 步骤&#xff1a; 输入locale&#xff0c;如有zh cn 表示已经安装了中文语言 如果没有&#xff0c;通过yum groupinstall chinese-support下载 临时更换语言&#xff1a;输入LANG"en_US.UTF-8"系统设置&a…