当前位置: 首页 > 编程日记 > 正文

golang bufio.newscanner如何超时跳出_Golang微服务的熔断与限流

(给Go开发大全加星标)

来源:Che Dan

https://medium.com/@dche423/micro-in-action-7-cn-ce75d5847ef4

【导读】熔断和限流机制对于大流量高并发服务来说不可或缺,尤其在微服务架构下更需要在服务中配置熔断限流机制。对可用性要求高的系统,熔断和限流是非常必要的保障可用性手段,本文介绍了Golang熔断和限流的实现。

529cfd44023aa233a0ca1559fe3a0821.png

今天来谈谈熔断与限流。

熔断与限流一直大型系统架构的重要话题。当我们开始把系统拆分成由很多微服务组成分布式系统时, 这些话题变得比以往更加重要。没有熔断与限流, 系统很容易因为单个组件的故障(这在分布式系统中不可避免)而形成“雪崩”效应, 进而导致整个系统的瘫痪。

在Micro的可插拔架构之下,可以非常容易地引入以上机制。我们知道Micro支持用中间件实现请求的拦截与控制。而这些中间件中最关键的两类是:

  1. micro.WrapClient ,用于包装对外发出的请求,即客户端包装

  2. 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容器术语实用导论

如果觉得本文不错,欢迎转发推荐给更多人。

3644309120a2da12e957c13ca414b2b1.png

分享、点赞和在看

支持我们分享更多好文章,谢谢!

相关文章:

JasperReport报表设计4

在JRXML模板&#xff08;或JRXML文件&#xff09;中的JasperReport 都是标准的 XML文件&#xff0c;以.JRXML扩展。所有JRXML文件包含标签<jasperReport>&#xff0c;作为根元素。这反过来又包含许多子元素&#xff08;所有这些都是可选的&#xff09;。JasperReport框架…

C++基本要点复习--------coursera程序设计实习(PKU)的lecture notes

因为一些特性复杂&#xff0c;很多时候也用不到一些特性&#xff0c;所以忘记了&#xff0c;算是随笔&#xff0c;也当作一个临时查找的手册。没有什么顺序&#xff0c;很杂。 1.构造函数通过函数重载的机制可以有多个&#xff08;不同的构造函数&#xff0c;参数个数&#xff…

Kibana + Elasticsearch + ik分词的集群搭建

Elasticsearc&#xff1a; Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;可以用于全文检索、结构化检索和分析&#xff0c;并能将这三者结合起来。Elasticsearch 基于 Lucene 开发&#xff0c;是 Lucene 的封装&#xff0c;提供了 REST API 的操作接口&#xff0c;开…

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个参数&#xff1a; SrvccToGeranOrUtranCapability 参…

[YY题]HDOJ5288 OO’s Sequence

题意&#xff1a;求这个式子 $\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&#xff0c; 若是&#xff0c;则这个区间满足条件 问有…

python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据

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

操作无法完成后台打印程序无法运行

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

NodeJS 模块

cheerio 可以用jQuery操作DOM&#xff08;服务器端&#xff09; 转载于: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连接&#xff0c;主要目的&#xff1a; 1. To establish/modify/release Radio Bearers; 无线承载 2. To perform Handover; 切换 3. To setup/modify/release Measurements; 测量…

H - Parity game-poj1733(需要离散化)

题意&#xff1a;给一个序列这个序列都是由0和1组成&#xff0c;现在随意拿出来一个序列&#xff0c;然后说出他的和是奇数还是偶数&#xff0c;因为有可能存在假话&#xff0c;让你判断前多少条没有假话&#xff0c;也就是查找第一个假话的位置-1//这道题很像D题&#xff0c;都…

redis 缓存过期默认时间_缓存的必知必会:一文搞懂Redis持久化和过期机制

本文主要介绍了 Redis 持久化的两种机制&#xff1a;RDB 和 AOF&#xff0c;以及键过期的策略&#xff1a;惰性删除和定期删除&#xff0c;还有 RDB、AOF 和复制功能对过期键的处理。RDBRDB 是 Redis 持久化的第一种方式。有两个 Redis 命令可以用于生成 RDB 文件&#xff0c;一…

ASP.NET MVC 5 - 视图

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

java内存泄漏问题排查

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

的正确使用_弹力袜的正确使用

何为弹力袜&#xff1f;弹力袜是预防下肢静脉疾病的重要措施&#xff0c;其设计上远心端压力大&#xff0c;近心端压力小。医用循序减压弹力袜在脚踝部建立最高支撑压力&#xff0c;顺着腿部向上逐渐递减&#xff0c;在小腿肚减到最大压力值的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 网上有两种办法&#xff0c;其实原理一样第一种说法&#xff1a;还真的找到解决的方法了,如下: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成功之后&#xff0c;ENB配置UE的SR子帧位置和发送周期&#xff0c;如果接入UE过多周期就长&#xff0…

qrcode生产带logo_“白板”口罩打上LOGO装名牌 警方重拳出击清市场

看看新闻Knews记者 毛鸿仁2020-09-17 10:19假冒口罩危害大&#xff0c;无良商家被查处。近日&#xff0c;上海松江警方侦破了一起假冒品牌口罩的案件&#xff0c;犯罪嫌疑人赵某等人被松江警方依法采取刑事强制措施。7月下旬&#xff0c;上海市公安局松江分局通过警企协作&…

Tomcat 服务器的端口号的修改

在系统中找到Tomcat安装目录下的conf文件夹下的servlet.xml文件。 &#xff08;1&#xff09;在servlet.xml文件中找到以下代码&#xff1a; <connector port"8080" protocol"HTTP/1.1" connectionTimeout"20000" redirectPort"8443&q…

js获取宽度设置thickbox百分比

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

【算法总结】数学问题-最大公约数和最小公倍数

【算法总结】最大公约数和最小公倍数 一、最大公约数&#xff08;GCD&#xff1a;greatest common divisor&#xff09; 欧几里得算法&#xff1a; 若 a、b 全为零则它们的最大公约数不存在&#xff1b;若 a、b 其中之一为零&#xff0c;则它们的最大公约数为 a、b 中非零的那个…

javascript 手势缩放 旋转 拖动支持:hammer.js

原文&#xff1a; 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是探测参考信号的缩写&#xff0c;所谓参考信号&#xff0c;那么是为谁提供参考&#xff1f;参考的指标是什么&#xff1f;答案是为eNodeB的调度提供参考&#xff0c;参考的内容是为上行信道质量做参考。那么为什么需要SRS呢&#xff1f;众所周知&#xff0c;在LTE网络中&am…

机器人瓦力船长机器人_警察“瓦力”来啦!机器人巡逻南京路 这样的它你喜欢吗?...

电影“瓦力”中的机器人主角瓦力让人印象深刻&#xff0c;这两天&#xff0c;一台形似瓦力的机器人出现在了南京路步行街上&#xff0c;一下子就成为了这条街上“最靓的仔”&#xff0c;实际上&#xff0c;它是一台功能强大的警用巡逻机器人。“我正在南京路步行街执行巡逻任务…

转 mac svn用法

mac svn 删除.svn隐藏文件的命令 打开终端,进到所在的目录,然后出入一下代码 find . -name ".svn" | xargs rm -Rf 1、将文件checkout到本地目录svn checkout path&#xff08;path是服务器上的目录&#xff09;例如&#xff1a;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