golang bufio.newscanner如何超时跳出_Golang微服务的熔断与限流
(给Go开发大全
加星标)
来源:Che Dan
https://medium.com/@dche423/micro-in-action-7-cn-ce75d5847ef4
【导读】熔断和限流机制对于大流量高并发服务来说不可或缺,尤其在微服务架构下更需要在服务中配置熔断限流机制。对可用性要求高的系统,熔断和限流是非常必要的保障可用性手段,本文介绍了Golang熔断和限流的实现。
今天来谈谈熔断与限流。
熔断与限流一直大型系统架构的重要话题。当我们开始把系统拆分成由很多微服务组成分布式系统时, 这些话题变得比以往更加重要。没有熔断与限流, 系统很容易因为单个组件的故障(这在分布式系统中不可避免)而形成“雪崩”效应, 进而导致整个系统的瘫痪。
在Micro的可插拔架构之下,可以非常容易地引入以上机制。我们知道Micro支持用中间件实现请求的拦截与控制。而这些中间件中最关键的两类是:
micro.WrapClient ,用于包装对外发出的请求,即客户端包装
micro.WrapHandler ,用于包装外界发来的请求,即服务端包装
这两类中间件刚好分别适用于熔断和限流两个场景。下面我们以实例来说明如何利用这类两中间件来提高系统的鲁棒性。
熔断
你可能已经猜到了, 如此常见的工具一般情况下不需要我们自己开发。社区中已经有一些非常优秀的开源熔断组件,例如 hystrix-go,gobreaker 。不仅如此, Micro 也提供了对上述组件进行简单封装的插件, 如 hystrix 插件, gobreaker 插件。
有了这些插件的帮助, 在Micro中实现熔断就变得非常简单了。以hystrix为例:
import (... "github.com/micro/go-plugins/wrapper/breaker/hystrix"...)func main(){... // New Service service := micro.NewService( micro.Name("com.foo.breaker.example"), micro.WrapClient(hystrix.NewClientWrapper()), ) // Initialise service service.Init()...}
只需要在创建service实例的时候指定hystrix插件,系统便具备了自动熔断能力。
所有从此节点发出的Micro服务调用都会受到熔断插件的限制和保护。当请求超时或并发数超限,调用方会立即接收到熔断错误。那么默认的并发限制和时间限制是多少呢?答案在hystrix-go 的源码中。查看github.com/afex/hystrix-go/hystrix/settings.go 将看到几个包级变量:
... // DefaultTimeout is how long to wait for command to complete, in milliseconds DefaultTimeout = 1000 // DefaultMaxConcurrent is how many commands of the same type can run at the same time DefaultMaxConcurrent = 10...
可见默认的超时时间是1000毫秒, 默认最大并发数是10。
注:可调整的熔断设置不只这两项, 但对他们每一项的详细讨论超过了本文范围, 因此不作更多说明。如果有兴趣,可以到hystrix-go官网查看详细文档。
如果默认设置不能满足我们的要求, 则可以通过如下方式修改:
import (... hystrixGo "github.com/afex/hystrix-go/hystrix" "github.com/micro/go-plugins/wrapper/breaker/hystrix"...)func main(){... // New Service service := micro.NewService( micro.Name("com.foo.breaker.example"), micro.WrapClient(hystrix.NewClientWrapper()), ) // Initialise service service.Init() hystrix.DefaultMaxConcurrent = 3//change concurrrent to 3 hystrix.DefaultTimeout = 200 //change timeout to 200 milliseconds...}
如代码所示,默认限制被调整成了3个并发及200毫秒。
你可能会对 DefaultMaxConcurrent 有疑问:这个并发限制的作用域是什么呢?假设我们需要同时调用3个服务,每个服务有3个不同方法。那么是不是说我们必须把DefaultMaxConcurrent设置为成大于33的数字才可以彻底并发呢? *要回答这个问题, 需要搞清楚两点:
首先, DefaultMaxConcurrent 的限制的目标是什么。从hystrix 文档可以看到, 它的目标是hystrix 中的 command:
DefaultMaxConcurrent is how many commands of the same type can run at the same time
接下来就需要看看hystrix插件如何处理不同方法与command的关系。查看 github.com/micro/go-plugins/wrapper/breaker/hystrix/hystrix.go 相关代码如下:
import( "github.com/afex/hystrix-go/hystrix" ...)...func (c *clientWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { return hystrix.Do(req.Service()+"."+req.Endpoint(), func() error { return c.Client.Call(ctx, req, rsp, opts...) }, nil)}...
可以看到每一个方法调用都被 hystrix.Do 包装起来。注意其中的req.Service()+”.”+req.Endpoint(),它就是hystrix的command。由于这个字符串中没有包含节点信息, 这意味着对于同一个服务,部署单个还是多个节点对于熔断来说是没有区别的,所有节点都共享一组限制。
至此便可以明确:每一个服务的每一个方法会独立进行并发限制计数,彼此并不影响。DefaultMaxConcurrent 的作用域是方法级的,与节点数无关。因此, 当某个服务的节点数被扩容一倍, 那么也有必要修改相应hystrix 限制,否则此扩容可能无法发挥全部效果。
实践中, 不同方法可能需要不同的熔断指标。如果我们想要更细粒度地进行控制,应该怎么办呢?从上面的源码分析可以看出, 服务方法被映射成了 hystrix command,而hystrix是支持对不同command分别设限的, 具体方法如下:
...hystrix.ConfigureCommand("com.serviceA.methodFoo", hystrix.CommandConfig{ MaxConcurrentRequests: 50, Timeout: 10, })hystrix.ConfigureCommand("com.serviceB.methodBar", hystrix.CommandConfig{ Timeout: 60, })...
通过上述代码,我们为两个方法设置了不同的限制。如果某一项没有特别说明, 便会使用系统默认值。
小结: 熔断功能作用于客户端,设置恰当阈值以后, 它可以保障客户端资源不会被耗尽 —— 哪怕是它所依赖的服务处于不健康的状态,也会快速返回错误,而不是让调用方长时间等待。
限流
与熔断类似, 限流也是分布式系统中常用的功能。不同的是, 限流在服务端生效,它的作用是保护服务器:在请求处理速度达到设定的限制以后, 便不再接收和处理更多新请求,直到原有请求处理完成, 腾出空闲。避免服务器因为客户端的疯狂调用而整体垮掉。
打个比方, 假设我们运营一间能容纳10位客人的餐馆。如果同时来了100位客人想要用餐,最好的处理方式是选取前10位进行服务,同时告诉另外90位客人:我们目前无法服务,请改天再来。虽然这90位客人会不开心, 但我们至少保证了前10位可以开心地用餐。
若没有限流措施, 结果是100位客人全进入餐厅, 厨房忙不过来, 客人无处落座。任何人都得不到服务,又不甘心离开。最终的结果是整个餐厅人满为患并最终瘫痪。
在Micro中使用限流功能非常简单,只需增加一行代码就可以实现基于QPS的限流。目前有两个的现成的限流插件可供使用, 本文以 uber rate limiter 插件为例进行说明(当然如果现有插件不满足需求, 完全可以自行开发更适用的插件)。修改hello-srv/main.go:
package mainimport (... limiter "github.com/micro/go-plugins/wrapper/ratelimiter/uber"...)func main() { const QPS = 100 // New Service service := micro.NewService( micro.Name("com.foo.srv.hello"), micro.Version("latest"), micro.WrapHandler(limiter.NewHandlerWrapper(QPS)), )...}
以上代码便为hello-srv增加了服务器限流能力, QPS上限为100。这个限制由此服务的所有handler所有method 共享。换句话说,此限制的作用域是服务级别的。
总结
熔断和限流很重要。得益于Micro的可插拨架构, 我们可以非常方便地应用这两个重要的功能。
熔断的出发点是保护客户端, 不被外部服务的问题所拖累, 永远快速响应(哪怕得到一个错误,也好于长时间等待)。永远避免资源的过度消耗。
限流的出发点是保护服务器。只处理自己能力之内的流量,实现过载保护。当流量超过设定限制时立即返回错误。
二者结合体现了一个哲学:永远首先为自己负责, 无论外部依赖状态如何, 一个服务应保证自身的稳健。
当这种哲学应用到分布系统的每一个组件以后, 这个系统将变得非常健壮,不会被突发流量高峰击垮。
因此, 我们在分布式系统开发中应该遵循这样一个最佳实践:为每一个服务增加熔断和限流能力。起步时可以是粗粒度的限制, 随着业务的演进, 可以逐步细化控制, 为每一个(每一类)服务设置与其业务相匹配的限制策略。
- EOF -
推荐阅读(点击标题可打开)1、Golang 垃圾回收原理与优化
2、Go 性能分析工具 pprof 入门
3、RedHat容器术语实用导论
如果觉得本文不错,欢迎转发推荐给更多人。
分享、点赞和在看
支持我们分享更多好文章,谢谢!
相关文章:

JasperReport报表设计4
在JRXML模板(或JRXML文件)中的JasperReport 都是标准的 XML文件,以.JRXML扩展。所有JRXML文件包含标签<jasperReport>,作为根元素。这反过来又包含许多子元素(所有这些都是可选的)。JasperReport框架…

C++基本要点复习--------coursera程序设计实习(PKU)的lecture notes
因为一些特性复杂,很多时候也用不到一些特性,所以忘记了,算是随笔,也当作一个临时查找的手册。没有什么顺序,很杂。 1.构造函数通过函数重载的机制可以有多个(不同的构造函数,参数个数ÿ…

Kibana + Elasticsearch + ik分词的集群搭建
Elasticsearc: Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,是 Lucene 的封装,提供了 REST API 的操作接口,开…
VOLTE parameter in Attach Request/Accept message
VOLTE字面上是:Voice over LTE. 但是人们所提到的VOLTE,实际上是指“Voice over LTE utilizing IMS” Attach Request/Accept消息中包含了VOLTE相关的参数。 1. Attach request 参考: 3GPP 24.301 – 8.2.4 关注红框内的3个参数: SrvccToGeranOrUtranCapability 参…

[YY题]HDOJ5288 OO’s Sequence
题意:求这个式子 $\sum \limits_{i1}^{n} \sum \limits_{j1}^{m} f(i, j) mod (10^9 7)$ 的值 就是对每个区间[i, j]枚举区间中的每个数$a_i$到$a_j$, 判断这个$a$是否对[i, j]这个区间内所有数取模都不等于0, 若是,则这个区间满足条件 问有…

python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据
在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题:读取这样的表格:输出这样的数据结果:然而这样的结果却不是我们想要的,我们需要的是这样的结果:1、安装python官方库---datetime引入datetime库import d…

操作无法完成后台打印程序无法运行
同事反映原共享的打印机无法打印。我删除重新添加时系统提示 操作无法完成后台打印程序无法运行。于是我打开服务找到print spooler服务进程设置自动开启后重新添加问题依旧。在网上查到的方法是病毒清了后你的 SPOOLSV.EXE文件就没有了,且在服务里你的后台打印print spooler也…

NodeJS 模块
cheerio 可以用jQuery操作DOM(服务器端) 转载于:https://www.cnblogs.com/tujw/p/11054252.html

Linux下netstat命令详解&&netstat -anp | grep 讲解
Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

Linux命令——根据端口号查进程
查出的数据第二列(16615)是elasticsearch的进程号。通常我们会根据端口号查进程号,或者通过进程号查端口号。linux环境下,我们常常会查询进程号pid。最常用ps -ef |grep xx。根据端口port查进程。根据端口port查进程。根据进程pid查端口。根据进程pid查端口。
RRC Connection Reconfiguration
RRC Connection Reconfiguration Dir: E-UTRAN -> UE SRB: SRB1 这个消息用来修改RRC连接,主要目的: 1. To establish/modify/release Radio Bearers; 无线承载 2. To perform Handover; 切换 3. To setup/modify/release Measurements; 测量…

H - Parity game-poj1733(需要离散化)
题意:给一个序列这个序列都是由0和1组成,现在随意拿出来一个序列,然后说出他的和是奇数还是偶数,因为有可能存在假话,让你判断前多少条没有假话,也就是查找第一个假话的位置-1//这道题很像D题,都…

redis 缓存过期默认时间_缓存的必知必会:一文搞懂Redis持久化和过期机制
本文主要介绍了 Redis 持久化的两种机制:RDB 和 AOF,以及键过期的策略:惰性删除和定期删除,还有 RDB、AOF 和复制功能对过期键的处理。RDBRDB 是 Redis 持久化的第一种方式。有两个 Redis 命令可以用于生成 RDB 文件,一…

ASP.NET MVC 5 - 视图
2019独角兽企业重金招聘Python工程师标准>>> 在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML。 您将创建一个视图模板文件,其中使用了ASP.NE…

java内存泄漏问题排查
背景:程序部署在客户机器上,不定期异常崩溃,且无日错误异常日志记录。 day1:初步排查是内存问题导致的,考虑使用分析工具记录分析。另外代码review仔细排查,怀疑有可能跟大量网络socket没有释放有关。 程序…

的正确使用_弹力袜的正确使用
何为弹力袜?弹力袜是预防下肢静脉疾病的重要措施,其设计上远心端压力大,近心端压力小。医用循序减压弹力袜在脚踝部建立最高支撑压力,顺着腿部向上逐渐递减,在小腿肚减到最大压力值的70%-90%,在大腿处减到最大压力值的…

yii2的安装
yii2也是依赖于composer, 就像laravel, 所以先安装composer, 如果安装不上composer可以看laravel安装的文章. 安装好composer之后安装一个插件 composer global require "fxp/composer-asset-plugin:1.0.0"或composer global require "fxp/composer-asset-plugi…

eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样...
eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样第一种说法:还真的找到解决的方法了,如下:1.退出eclipse2.到[工程目录下]/.metadata/.plugins/org.eclipse.core.runtime3.把org.eclipse.wst.server.co…

代码示例_网络编程_select
select_多路复用 1.头文件 1 #pragma once2 3 #include <stdio.h>4 #include <stdlib.h>5 #include <sys/types.h>6 #include <sys/select.h>7 #include <sys/time.h>8 #include <sys/socket.h>9 #include <strings.h> 10 #include …

LTE中基本通信过程的理解——上行调度
上行调度1. UE向ENB请求上行资源Physical channel: PUCCHMessage: SR (schedule request)根据上层的配置UE按照一定的周期和子帧位置上通过PUCCH中的控制消息UCI传输SR【RACH成功之后,ENB配置UE的SR子帧位置和发送周期,如果接入UE过多周期就长࿰…

qrcode生产带logo_“白板”口罩打上LOGO装名牌 警方重拳出击清市场
看看新闻Knews记者 毛鸿仁2020-09-17 10:19假冒口罩危害大,无良商家被查处。近日,上海松江警方侦破了一起假冒品牌口罩的案件,犯罪嫌疑人赵某等人被松江警方依法采取刑事强制措施。7月下旬,上海市公安局松江分局通过警企协作&…

Tomcat 服务器的端口号的修改
在系统中找到Tomcat安装目录下的conf文件夹下的servlet.xml文件。 (1)在servlet.xml文件中找到以下代码: <connector port"8080" protocol"HTTP/1.1" connectionTimeout"20000" redirectPort"8443&q…

js获取宽度设置thickbox百分比
thickbox的宽高不好设为百分比,这样遇到不同的尺寸的电脑就会出现问题。 怎么做呢? 通过js来处理。 <script type"text/javascript">$(function(){var width window.screen.width;//通用,各浏览器都支持获取宽度width widt…

【算法总结】数学问题-最大公约数和最小公倍数
【算法总结】最大公约数和最小公倍数 一、最大公约数(GCD:greatest common divisor) 欧几里得算法: 若 a、b 全为零则它们的最大公约数不存在;若 a、b 其中之一为零,则它们的最大公约数为 a、b 中非零的那个…

javascript 手势缩放 旋转 拖动支持:hammer.js
原文: https://cdn.rawgit.com/hammerjs/hammer.js/master/tests/manual/visual.html /*! Hammer.JS - v2.0.4 - 2014-09-28* http://hammerjs.github.io/** Copyright (c) 2014 Jorik Tangelder;* Licensed under the MIT license */ (function(window, document, …
探测参考信号(Sounding Reference Signal)
SRS是探测参考信号的缩写,所谓参考信号,那么是为谁提供参考?参考的指标是什么?答案是为eNodeB的调度提供参考,参考的内容是为上行信道质量做参考。那么为什么需要SRS呢?众所周知,在LTE网络中&am…

机器人瓦力船长机器人_警察“瓦力”来啦!机器人巡逻南京路 这样的它你喜欢吗?...
电影“瓦力”中的机器人主角瓦力让人印象深刻,这两天,一台形似瓦力的机器人出现在了南京路步行街上,一下子就成为了这条街上“最靓的仔”,实际上,它是一台功能强大的警用巡逻机器人。“我正在南京路步行街执行巡逻任务…

转 mac svn用法
mac svn 删除.svn隐藏文件的命令 打开终端,进到所在的目录,然后出入一下代码 find . -name ".svn" | xargs rm -Rf 1、将文件checkout到本地目录svn checkout path(path是服务器上的目录)例如:svn checkout svn://192.168.1.1/pro/…

MySQL图形处理软件Navicat字体配置(乱码解决)
设置字体 1.常规 Noto Sans Mono CJK TC Regular 2.编辑器 Noto Sans CJK SC Regular 3.记录 Noto Sans Mono CJK TC Regular 转载于:https://www.cnblogs.com/jrri/p/11075040.html