首页 > 其他分享 >go 进阶训练营 微服务可用性(下)笔记

go 进阶训练营 微服务可用性(下)笔记

时间:2023-08-27 14:35:29浏览次数:45  
标签:降级 进阶 可用性 负载 重试 go 节点

降级:

减少工作量,丢弃不重要的请求。

确定具体采用哪个指标作为流量评估和优雅降级的决定性指标:
如 CPU、延迟、队列长度、线程数量、错误等

当服务进入降级时,需要执行什么动作?

流量抛弃或者优雅降级应该在服务的哪一层实现?是否需要在整个服务的每一层都实现,还是可以选择某个高层面的关键节点来实现?

优雅降级不应该被经常出发,通常触发条件是容量规划的失误,或者是意外的负载

内部参与的项目,聚合多个部门的接口进行展示,配置了降级逻辑,设计的足够简单,因为平常是不怎么使用的,如果特别复杂等到需要使用的时候操作比较复杂。

应该足够简单 -- 演练

重试:

当请求返回错误,对于backend部分节点过载的情况下,倾向于立刻重试,但是需要留意重试带来的流量放大

限制重试次数和基于重试分布的策略(重试比率:10%)
随机化、指数型递增的重试周期:exponential ackoff+jtter
client 测记录重试次数直方图,传递到server,进行分布判断,交由server判定拒绝
只应该在失败的这层进行重试,当重试仍然失败,全局预定错误码,过载,无须重试,避免级联重试

503 逐层放行,往上抛

负载均衡:

数据中心内部的负载均衡
理想情况下,某个服务的负载回完全均匀地分发给所有后端任务。
在任何时刻,最忙和最不忙的节点永远消耗同样数量的CPU.

目标:
均衡的流量分发
可靠的识别异常节点
scale-out,增加同质节点扩容
减少错误,提高可用性

backend 之间的load差异比较大:
每个请求的处理成本不同
物理机环境的差异:
服务器很难强同质性
存在共享资源争用(内存缓存、带宽、IO等)
性能因素:
FullGc
JVM JIT

负载均衡算法:缺乏的是服务端全局视图,负载+可用性
选择backend:CPU,client:health、inflight、latency,
使用一个简单的线性方程进行打分

p2c 算法:本质就是根据服务器的各种资源进行打分计算,然后选择合适的节点进行请求。
https://github.com/go-kratos/kratos/blob/v1.0.x/pkg/net/rpc/warden/balancer/p2c/p2c.go

对新启动的节点使用常量惩罚值(penalty),以及使用探针方式最小化放量,进行预热。

打分比较低的节点,避免进入 永久 黑名单,而无法恢复,使用统计
衰减的方式,让节点指标逐渐恢复到初始状态(即默认值)

标签:降级,进阶,可用性,负载,重试,go,节点
From: https://www.cnblogs.com/zhangpengfei5945/p/17660254.html

相关文章

  • Mongodb 笔记
    MongoDb:非关系型数据库,基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多的节点,可以保证服务器的性能MongoDB操作 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类似JSON的二进制形式的存储格式,是BinaryJSON的......
  • django 解决queryset惰性机制,实现实时查询
    django在第一次查询后,就把数据进行缓存。如果对数据进行操作后,再进行查询时直接去缓存中取而不去数据库查询,对于想要实时数据时这并不友好。在百度后解决方案如直:classTodayRecordView(viewsets.ModelViewSet):serializer_class=OrderRecordSerializerpagination_c......
  • Django学习小记[3] —— Query
    今天学习的是Django的ModelQuery,前一篇已经学习过Model了,讲述的主要是Django中是如何处理关系型数据的模型的,一对一,多对一,多对多等,这篇则主要是描述的查询,能够将数据存进去,还得取出来,Django给每一个Model自动提供了丰富的查询接口,而且能够进行关联查询,基本上,能够满足绝大多数的查......
  • Django学习小记[6]——Class-based View
    这节我们讲一下Class-basedView,为什么要有这个Class-basedView呢?view不都是一个方法吗?跟类有啥关系?其实答案很明显,用类其实是为了抽象,抽象出通用的,将可变的暴露出来,这样我们就可以用最少的代码实现复杂的功能了。Django中,对那些我们平时经常用的View进行了封装,比如用于渲染一......
  • Django学习小记[4]——URL Dispatcher
    URLdispatcher简单点理解就是根据URL,将请求分发到相应的方法中去处理,它是对URL和View的一个映射,它的实现其实也很简单,就是一个正则匹配的过程,事先定义好正则表达式和该正则表达式对应的view方法,如果请求的URL符合这个正则表达式,那么就分发这个请求到这个view方法中。有了这个bas......
  • Django学习小记[2] —— Model
    开始学习django的model了,学习django的目的很简单,就是我想用django搭建一个自己的博客,现在开源的已经有django-zinnia这个博客引擎了,但是想要看懂它,并且修改它,就必须过django这一关。之前对django的了解,仅仅限于用到了什么,就知道什么,缺乏系统的学习,所以要把django的文档都过一遍,做......
  • Django学习小记[1] —— Start
    Part1Part1通过举例,从整体上过了一遍django的基本内容,包括project,app,database,model等内容。有几下内容需要注意:projectvs.appapp是一个web应用程序,它是实际用来做事的,比如zinnia这个用django写的博客引擎就是一个app,但是一个project是配置文件和app的集合,相当于一个......
  • Google Analytic 4 All In One
    GoogleAnalytic4AllInOneGoogleAnalytics(分析)4(GA4)GA4是新一代的GoogleAnalytics(分析),可为您提供隐私控制功能、预测性数据、直接产品关联,以及可自定义的网站和移动应用报告。我们根据您现有的媒体资源为您创建了这项新的GA4媒体资源。该简短教程将介绍一些重......
  • Android平台RTMP|RTSP直播播放器功能进阶探讨
    我们需要怎样的直播播放器?很多开发者在跟我聊天的时候,经常问我,为什么一个RTMP或RTSP播放器,你们需要设计那么多的接口,真的有必要吗?带着这样的疑惑,我们今天聊聊Android平台RTMP、RTSP播放器常规功能,如软硬解码设置、实时音量调节、实时快照、实时录像、视频view翻转和旋转、画面填充......
  • GO语言中的参数传递
    在Go语言中,函数参数传递有两种方式:值传递和引用传递。值传递(PassbyValue):当将一个值作为参数传递给函数时,函数会创建该值的一个副本,并将副本传递给函数。在函数内部,对参数的修改不会影响原始值。下面是一个示例:packagemainimport"fmt"funcmodifyValue(xint){x......