https://github.com:duke-git/lancet
介绍
lancet(柳叶刀)是一个全面、高效、可复用的go语言工具函数库。 lancet受到了java apache common包和lodash.js的启发。本篇仅针对其中的retry功能进行解读。
快速图解
功能解读
重试在微服务调用的过程中可以有效的应对上游接口不稳定,网络状态差等问题,为下游提供稳定可靠的服务。也算是一种降级处理的方式
Lancet Retry
Lancet 中的 retry 包中关于 重试的逻辑进行的抽象,提供了不同的重试策略, 线性避退 或 指数避退 ,并在每次重试间隔加上一定的抖动间隔,确保不会触发上游接口的限流策略。
代码解析
Lancet Retry
重试策略配置
重试间隔接口
对比不同的重试间隔策略,其实就是每次重试间隔不同,所以只需要提供一个下次重试间隔的接口就可以了
重试功能
RetryFunc 为重试的具体实现
Option 是选项设置模式,用于灵活的生成对象,具体的可以看话唠区/Option模式好处
其他的部分就比较简单了,直接根据执行的结果的成功失败,失败的话则根据 backoffStrategy.CalculateInterval
计算出来的时间间隔进行避退,并根据ctx.Done()
及时取消重试。
还有一段比较有意思的函数段是用于获取 函数指针指向的具体函数的名称:
重试间隔实现
线性重试
比较简单,每次返回的重试间隔是一样的
指数重试
可以看到每次都是以base
为底数,指数每次重试迭代+1 最大为 重试次数 ,并扩大 interval
倍 的重试间隔
位移间隔重试
这个间隔的避加以interval
为操作数,左移操作shifter
位
话唠区
Option模式好处
当创建对象需要新增一个可选配置选项时-潜台词就是如果不设置就会有默认值,只需要创建新参数对应的的Option就可以了。
可以简单对比下使用和不使用Option的情况下,对于调用方的影响
Bad Case
Good Case
可以发现调用方在调用创建新版本对象的时候,可以不用改动,也可以使用WithMaxLifeTime
进行设置,这也符合可选配置选项的含义
如果你看不到评论,那么就真的看不到评论w(゜Д゜)w