领导:随着微服务的普及,引信被广泛认为是最重要的技术之一。当微服务运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保证后端微服务不会因为持续过载而停机。本文介绍了引信的原理和机理,并举例说明了如何使用引信。
今天,让我们讨论微服务架构的灵活扩展。一般来说,各种服务可以同步或异步地相互通信。我们假设一个大的单一系统被分成几个小模块来分离服务。事实上,管理内部服务之间的通信可能更困难。
这里有两个你可能听过的概念:fuse和retry机制。
保险丝保护器
想象一个简单的场景,一个用户的请求调用服务A,然后调用另一个服务。我们可以称B为a的下游服务,服务B的前面是负载均衡器。
后端服务可能会因为各种原因出错。例如,缓慢的数据库查询、网络波动或内存争用。在这种情况下,如果服务a超时或报告错误,用户可能会重试。在这种混乱的情况下,我们能做些什么来保护下游服务?
保险丝提供了对资源和故障率的更多控制。断路器旨在快速而优雅地处理错误,而无需等待TCP连接超时。这种快速失效机制将保护下游服务。这个机制最重要的部分是,融合器可以快速响应下游服务。线程池不会被慢速请求阻塞,也不会超时,还可能给终端用户更多有意义的返回数据。保险丝也给下游服务足够的时间恢复正常。完全避免报告错误是很难的,但是减少错误的影响是可行的。
通过使用海斯特里克斯保险丝,我们可以增加上游服务的退化行为。比如服务b可以访问副本服务或者缓存,而不是调用服务c,引入这个方法需要集成测试,因为我们可能无法在好的链路上模拟这个方法。
条件
保险丝有三种主要状态:
关闭:让请求通过的默认状态。如果请求成功/失败但低于阈值,则状态保持不变。可能出现的错误是超过最大并发数和超时错误。打开:当熔断器打开的时候,所有的请求都会被标记为失败;这是故障快速失败机制,而不需要等待超时时间完成。半开:定期的尝试发起请求来确认系统是否恢复。如果恢复了,熔断器将转为关闭状态或者保持打开。理论导火索
以下是控制保险丝设置的五个主要参数。
阈值可以从两个服务的SLA中获得。在测试服务和其他依赖关系的稳定性时,应该合理地设置这些值。
好的保险丝名称应该表示相应的服务连接报告了错误。事实上,您可能在同一个服务中有许多API端点。因此,需要为每个API端点配置一个单独的保险丝。
生产环境中的保险丝
保险丝通常部署在多个节点上。即使保险丝提供了快速错误报告机制,我们仍然需要确认待机降级逻辑是否有效。因为我们认为这是一个小概率事件,不测试相应的退化策略是有风险的行为。在最简单的操作中,我们还需要确保门槛合理。从我个人的经验来看,在日志中打印配置参数会让调试更容易。
演示
这个示例代码使用了海斯特里克斯-戈库,它是由戈朗的海斯特里克斯网飞库实现的。
运行这个测试,你会看到两次返回的结果是不同的。
重试机制
对于上面的fuse模型,如果B服务减少了它的实例数量会怎么样?由发起的许多请求可能会遇到5XX错误。这将触发保险丝的故障报警。这就是为什么我们需要再次尝试,以避免间歇性的网络抽搐。
简单重试代码:
重试模式
为了实现乐观并发控制,我们可以安排不同的服务在不同的时间重试。立即重试可能不合适,因为这会突然导致大量对相关服务的请求。增加暂停时间将有助于缓解这种情况。也可以在一定范围内随机设定暂停时间(或者在等待阶段摇动)。
让我们考虑以下算法:
指数: 基数* 2^尝试次数全抖动: 休眠时间 = rand(0 , 基数* 2^尝试次数)等抖动: 临时 = 基数 * 2^尝试次数; 休眠时间= 临时/2+rand(0 , 临时/2)不相关抖动: 休眠时间= rand(基数, 休眠时间*3);客户端数量与总负载和完成时间之间存在相关性。为了确定最适合系统的方法,有必要在客户端数量增加时进行基准测试。详细的实验可以在本文中找到。我的建议是在去抖动和全抖动之间。
两种工具的组合
断路器通常用于无状态在线交易系统,尤其是关键节点。重试应该用于调度不受超时限制的任务或节点。我们可以考虑同时使用两者。在大规模系统中,服务网格将是更好地协调大规模异构系统的理想框架。
参考链接:
1.https://github.com/afex/hystrix-go/
2.https://github.com/eapache/go-resiliency
3.https://github.com/Netflix/Hystrix/wiki
4.https://www.awsarchitectureblog.com/2015/03/backoff.html
5.https://dzone . com/articles/go-micro service-part-11-hystrix-and-resilience
原始地址:
https://medium . com/@ trong Dan _ tran/断路器-重试-64830e71d0f6
本文作者丹·陈(Dan Tran)由朱一坤翻译。请注明本文出处,欢迎更多朋友加入翻译投稿。详情请戳微信官方账号菜单“联系我们”。
参考读数:
技术原创、建筑实践类文章,请通过微信官方账号菜单“联系我们”提交。转载请注明来自高度可用架构“ArchNotes”的微信微信官方账号,并包含以下二维码。
1.《熔断制度 一文读懂熔断器和重试机制》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《熔断制度 一文读懂熔断器和重试机制》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/871756.html