这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
核心服务治理功能
服务发布(deployment)
定义: 即指让一个服务升级运行新的代码的过程。
难点: 很多服务都是在线的,不能在修改的时候停止服务,要思考三个问题:1.不能服务停止。2.服务抖动怎么办。3。万一服务升级出现错误怎么回滚。
方案一:
蓝绿部署:一个服务中换分成两个cluster,一个断开并升级,完成后重连再升级另一个cluster中的instance。
特点:简单、稳定,但是需要两倍资源。
方案二:灰度发布(也称金丝雀发布)
特点:需要精细化切分、回滚很繁琐。
流量治理(流量控制)
可以基于地区、集群、实例(不同实例部署的机器的新老程度)、请求等维度,对端到端的流量的路由路径进行加权选择。如图。
负载均衡(Load Balance)
定义: 负责分配请求在每个下游实例上的分布。
稳定性治理
线上服务总会出问题,这与程序的正确性无关。
- 网络攻击
- 流量突增
- 机房断电
- 光纤被挖
- 机器故障
- 网络故障
- 。。。。。。
治理方法
- 限流:发送大量请求时拒绝部分请求。
- 熔断:请求过大时断开连接。
- 过载保护:检测实例部署的机器的情况(如cpu使用率)来看是否拒绝请求。
- 降级:资源不够时接受高等级的请求,拒绝掉低级的请求。
字节服务治理实例
重试的意义
对于本地的函数调用,认为是没有什么重试的意义的。对于远程网络函数调用,重试可以避免偶发的错误,提高SLA(Service-Level Agreeme)
- 降低错误率
- 降低长尾延时:对于偶尔耗时较长的请求,重试请求有机会提前返回。
- 容忍暂时性的错误:如临时出现网络抖动。
- 避开下游故障实例:一个服务中可能有少量故障实例,重试其他实例可以成功。
重试的难点
重试风暴