摘要:对于那些希望使用华为云的云原生服务的人来说,这篇文章提供了很好的指导,让他们了解如何通过容错来保证他们的服务的可用性和稳定性。
本文分享自华为云社区《构建高可用云原生应用,如何有效进行流量管理?》,作者: breakDawn。
随着云原生的概念越来越火,服务的架构应该如何发展和演进,成为很多程序员关心的话题。大名鼎鼎的《深入理解java虚拟机》一书作者于21年推出了新作《凤凰架构》,从这本书中可以看到当前时下很多最新的技术或者理念。
因此本文以及后续都将持续沉淀发布这本书的学习笔记和思考,也欢迎购买该书进行详细学习,或者关注后续的学习笔记内容发布,了解精华内容和总结思考。
文章中介绍了故障转移、快速失败、安全失败、沉默失败、故障恢复、并行调用、广播调用等几种容错策略,我用表格的形式直观呈现一下这几种策略的区别,方便理解和选型:
1.断路器模式
即服务中发请求的地方都通过一个断路器模块来转发发送
当10秒内请求数量达到20,且失败阈值达到50%以上(这些参数都可以调整), 则认为出现问题, 于是主动进行服务熔断, 断路器收到的请求自动返回错误,不再去调用远程服务, 这样可避免请求线程各种阻塞,能及时返回报错。
中间会保持有间隔的重试直到恢复后,关闭断路。
2.舱壁隔离模式
如果一个服务中,可能要同时调用A\B\C三个服务,但是却共用一个线程池。
如果调用C服务超时,而调用C的请求源源不断打来,会造成C服务的请求线程全在阻塞,直接把整体线程池给占满了,影响了对A\B服务的调用。
一种隔离措施是对每个调用服务分别维护一个线程池。缺点是额外增加了排队、调度、上下文切换的开销,据说Hystrix线程池如果开启了服务隔离,会增加3~10ms的延迟。
另一种隔离措施是直接自己定义三个服务的计数器,当服务线程数量到达阈值,自动对这个服务调用做限流。
3.重试模式
故障转移和故障恢复这2个策略一般都是借助重试模式来处理的,进行重复调用。
重试模式应该满足以下条件才能使用:
重试模式应该有明确的终止条件,例如:
重试一定要谨慎开启, 有时候在网关、负载均衡器里也会配置一些默认的重试, 一旦链路很长且都有重试,那么系统中重试的次数将会大大增加。
流量控制需要解决以下3个问题
通过限制最大TPS来限流的话,不能够准确反映出系统的压力, 因此主流系统倾向使用HPS作为首选的限流指标。
流量计数器模式
统计每秒内的请求数是否大于阈值
缺点:
滑动时间窗模式
滑动时间窗专门解决了流量计数器模式的缺点。准备一个长度为10的数组,每秒触发1次的定时器。
缺点在于只能用于否决式限流, 必须强制失败或者降级,无法进行阻塞等待的处理。
漏桶模式
漏桶和令牌桶可以适用于阻塞等待的限流。漏桶就是一个以请求对象作为元素的先入先出队, 队列程度等于漏桶大小,当队列已满拒绝信的请求进入。比较困难的原因在于很难确定通的大小和水的流出速度,调参难度很大。
令牌桶模式
每隔一定时间,往桶里放入令牌,最多可以放X个,每次请求消耗掉一个。
可以不依赖定时器实现令牌的放入,而是根据时间戳,在取令牌的时候当发现时间戳满足条件则在那个时候放入令牌即可
前面的4个限流模式都只是单机限流,经常放在网关入口处,不适用于整个服务集群的复杂情况,例如有的服务消耗多有的服务消耗少,都放在入口处限流情况其实很多。
可以基于令牌桶的基础上,在入口网关处给不同服务加不同的消耗令牌权重,达到分布式集群限流的目的
以上主要介绍了服务容错和容错设计模式,涉及到不同的容错策略和容错设计模式,如故障转移、快速失败、安全失败、沉默失败、故障恢复、并行调用和广播调用。
这2个设计可以保证系统的稳定性和健壮性。这篇文章涉及的话题与云原生服务息息相关,因为云原生应用程序之间会频繁通过进行请求和交互,需要通过容错和弹性来保证高可用性。
因此,对于那些希望使用华为云的云原生服务的人来说,这篇文章提供了很好的指导,让他们了解如何通过容错来保证他们的服务的可用性和稳定性。
如果能通过将服务API注册到华为云提供的APIG网关上,似乎能够很方便地达成上述2个设计。
比如APIG支持断路器策略,是API网关在后端服务出现性能问题时保护系统的内置机制。当API的后端服务出现连续N次超时或者时延较高的情况下,会触发断路器的降级机制,向API调用方返回固定错误或者将请求转发到指定的降级后端。当后端服务恢复正常后,断路器关闭,请求恢复正常。APIG-断路器策略
同时APIG还提供了流量控制策略,支持从用户、凭据和时间段等不同的维度限制对API的调用次数,保护后端服务。支持按分/按秒粒度级别的流量控制,阅读了上文中提到的几个流量策略,再去看APIG里配置的流量策略值,则会很容易理解。APIG-流量控制策略
可以看到对于这些常见的经典服务设计策略,无需再重复造轮子,使用已有云服务,可以很快地实现相关功能,提升产品的上线速度和迭代效率。
点击关注,第一时间了解华为云新鲜技术~
在开发EasyShu的过程中,因为用户体验的倒逼,不得不认真再去学习下如何更好地解决Excel位数的问题。以下说一下使用代码去获取当前电脑上Excel的位数。方法一:通过Application.HinstancePtr属性这个方法弊端是需要拿到Excel的Application对象,安装过wps的电脑,可能会破坏正常调用Excel的能力。方法二:通过VBA代码的的Win64方法如果有办法在VBA环境下使用,那就好简单,上面的方法也行,下面的Win64方法也行。PublicFunctionIsOffice64()AsBoolean #IfWin64Then IsOffice64=True #Else IsOffice64=False #EndIf EndFunction复制方法三:通过Application.RegisterXLL来加载不同位数的xll文件这个方法,笔者在EasyShu里短暂用过一段时间,但弊端也是要拿到Excel的Application对象。如果加载对应位数的xll文件后返回结果为true,就证明是这个位数的版本。当然比方法一要折腾了,方法一今天才发现,没用得上,就被方
温馨提醒本项目使用MITLicense协议,仅适用于学习交流,欢迎提issue。若直接将本项目用于商用,因本项目带来的所有后果由使用者自行承担。在此奉劝某些人,请尊重作者的劳动成果,做人积点德吧!最近发现有人拿我的源码进行二次分发,不但不标注源码出处,甚至以此牟利。如果你花了钱购买本程序,请积极举报!项目地址(最新的README在这里查看):https://github.com/lx164/house[其他开源项目]表白墙https://github.com/lx164/SayLovehttps://www.cnblogs.com/LiangSenCheng/p/12543230.html[2021-04-06]更新说明:最近有不少反馈说,为什么已经注册成功了,在首页还是一直弹窗提示要注册,这个问题是因为上个月微信改了授权规则了,这里的授权规则需要你自己修改一下。官方具体公告请参考这里[2020-10-24]更新说明:有反馈说,按照配置无法正常使用管理员,请注意看配置过程第6步;主要问题是由于集合AdminStator中管理员信息与集合UserList中注册用户的信息不一致造成的请注意
XWiki默认是使用SLF4J和Logback来管理日志。Logback配置文件位于WEB-INF/classes/logback.xml。XWIkiclasspath下面第三方包生成的日志通过Logback配置文件的定义可以自动找到自己输出方式。由于原先使用的是ApacheCommonsLogging(JCL),Log4J作为日志框架,为了与SLF4J共存,通过SLF4J桥接器可以保证,既log4j-over-slf4j-*.jar和jcl-over-slf4j-*.jar。默认情况下,XWiki日志只输出到控制台。控制台内容是否被Servlet容器捕获取决于你使用的servlet容器。例如,部署在unix的tomcat能捕获标准输出并把信息输出到tomcat/logs/catalina.out。配置日志有多种方法配置日志。提出以下3种方法中,只有手动的方法是在服务器重新启动后也是持续有效的。所以,如果你的服务器可能会重新启动并且你想要在重启后保留修改的日志配置,唯一的方法是将它们添加到logback.xml。手动只需编辑的logback配置文件(logback.xml位于web应用
第一步:确认自己系统的架构dpkg--print-architecture 输出: amd64 结果为amd64表示系统是64位的复制第二步:确认打开了多架构支持功能dpkg--print-foreign-architectures 输出: i386复制如果这里没有输出i386,则需要打开多架构支持sudodpkg--add-architecturei386 sudoapt-getupdate复制第三步:安装对应的32位的库sudoapt-getdist-upgrade(#这一步是更新所有的软件,如果你对新版本软件的需求不是那么迫切,可以不执行) 或者只安装相关库 sudoapt-getinstalllib32z1lib32ncurses5(有的还需要32位stdc++库lib32stdc++6-4.8-dbg) 安装gccmultilab sudoapt-getinstallgcc-multilibg++-multilib复制总结以上所述是小编给大家介绍的ubuntu16.0464位兼容32位程序三步曲,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非
1.开发这套系统的初衷1.1快速了解一套数据库大家有没这种感觉,不论甲方还是乙方,拿到一套数据库我们很难快速的知道他的配置,数据库状态以及性能状态虽然我们手里有很多运维的脚本,但是无法有效的统一起来1.2提前定位性能瓶颈如果你对一套系统不了解,在运维过程中我们往往是迷茫的,心里没有底的特别是性能问题1.3多套数据库统一管理虽然Oracle有他的统一管理工具,但是我想大多数还是不用的吧1.4练手Python正好对于Python使用也有一段时间了,而工作上也有这种需求,所以才萌发了这个想法,根据自己实际运维中的需求来开发一套系统在开始今天的正式想说的是这套系统只是辅助我们日常的运维,对于Oracle本身的一些工具,如awr和statpack,ash等工具我们还是需要熟练掌握的这次的分享是对上次分享的一些改进,增加了一些新的功能首先先列出来使用到的一些环境:开发环境操作系统:CentOS7.4Python版本:3.6Django版本:1.10.5操作系统用户:omslinux/unix模块:paramikoOracle模块:cx_OracleSQLServer模块:pymssql数据分析:p
很多人觉得火焰图炫酷。如果只从操作上来说,真是没什么难度,只比大象放冰箱稍微难点。这里演示一下perf结果怎么放冰箱,不,是怎么生成火焰图!perf结果生成火焰图 第一步:随便录点啥,我这里是所有操作,主要是生成perf.data文件。[root@7DGroupFlameGraph]#perfrecord-F99-a-g--sleep60 [perfrecord:Wokenup7timestowritedata] [perfrecord:Capturedandwrote1.868MBperf.data(11880samples)] [root@7DGroupFlameGraph]#ll total1924 drwxr-xr-x7rootroot4096Mar407:42FlameGraph -rw-------1rootroot1965540Mar408:45perf.data复制第二步:转换成输出文件[root@7DGroupFlameGraph]#perfscript>out.perf [root@7DGroupFlameGraph]#ll total7460 drwxr-x
mplot3dexamplecode:surface3d_demo.py来自:http://matplotlib.org/examples/mplot3d/surface3d_demo.htmlfrommpl_toolkits.mplot3dimportAxes3D frommatplotlibimportcm frommatplotlib.tickerimportLinearLocator,FormatStrFormatter importmatplotlib.pyplotasplt importnumpyasnp fig=plt.figure() ax=fig.gca(projection='3d') X=np.arange(-5,5,0.25) Y=np.arange(-5,5,0.25) X,Y=np.meshgrid(X,Y) R=np.sqrt(X**2+Y**2) Z=np.sin(R) surf=ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=cm.coolwarm, linewidth=0,antia
一、简介本篇文章主要介绍集成LiteAVSDK商业版、6.6以上的版本,安卓端采用动态加载so的方式时的写法。安卓端非商业版aar集成、jar集成,可以参考官方集成文档。商业版aar集成,参考官方高级功能。6.6之前的商业版,如何动态加载so,请参考上一篇文章《LiteAVSDK集成,动态加载so库》。6.6版本前后动态加载so的差异:版本部分so必需在本地P图的so必需按顺序加载assets资源文件可否动态加载6.5-YYN6.6+NNY二、动态加载so1、下载sdk以LiteAVSDK_Enterprise_Android_6.8.7959版本为示例,下载解压sdk如下图:(左6.8、右6.5)1、商业版6.4之前的版本只支持armeabi架构。2019-05-15 2、商业版6.5增加支持armeabi-v7a架构。2019-06-12 3、商业版6.6增加支持arm64-v8a架构。2019-08-06 4、从商业版6.6开始,assets进行了分包,其中assets-static需要放到工程本地,assets-dynamic资源可以远程加载。复制2、本地集成jar、asset
第四阶段我们进行深度学习(AI),本部分(第一部分)主要是对底层的数据结构与算法部分进行详尽的讲解,通过本部分的学习主要达到以下两方面的效果:1.对开发中常见的算法能应用自如,让你在跳槽找工作中“算法题”不再是阻碍你“钱途”的拦路虎。2.我们不需要调参数的调参攻城狮,我们要做正真的自己的AI模型。3.本部分预计40篇左右。今天我们继续上节的内容--链表。上节我们分享的都是一些有关链表的基本内容,今天我们主要从代码的角度来聊聊有关链表的内容。第一、如何理解指针以及引用的含义? 我知道很多同学,一提到指针,就翻白眼,哈哈,其实也没有这么可怕,我今天用自己的方式给大家解释一下指针以及引用的相关操作。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。或者也可以这样理解:指针中存储了一个变量的内存地址,指向了这个变量。我们通过一个图来给大家解释一下: 我们在内存中分给空间的时候每个存储单元都有一个地址标识的,就像我们举的例子10000001H、10000002H这个就是唯一识别这个存储单元的“钥匙”,所以next指针会存储它要访问的下一个存储单元的这个“钥匙”,通过这个“钥匙”就会去找
我们在自定义View的时候通常需要先完成attrs.xml文件 在values中定义一个attrs.xml然后添加相关属性 这一篇先详细介绍一下attrs.xml的属性。<?xmlversion="1.0"encoding="utf-8"?> <resources> //自定义属性名,定义公共属性 <attrname="titleText"format="string"/> <attrname="titleTextSize"format="dimension"/> <attrname="titleTextColor"format="color"/> <attrname="image"format="reference"/> <attrname="imageScaleType"> <
使用gtest(gmock)方便我们编写组织c++单元测试。编译lib到github拉取代码或者下载某个版本的zip包到本地目录,参考gtest中的README.md如何编译库和编译自己的代码,下面简单介绍下编译方法手动编译$g++-isystem${GTEST_DIR}/include-I${GTEST_DIR}\ -pthread-c${GTEST_DIR}/src/gtest-all.cc $ar-rvlibgtest.agtest-all.o复制cmake编译gtest已经提供了cmakelist,可以直接使用cmake生成makefile,编译库和sample$mkdirmybuild#Createadirectorytoholdthebuildoutput. $cdmybuild $cmake${GTEST_DIR}#Generatenativebuildscripts. $make复制然后就可以在编译自己的测试程序时链接gtest了。$g++-isystem${GTEST_DIR}/include-pthreadpath/to/your_test.cclibgtest.
点击标题下「大数据文摘」可快捷关注女生胸越大越败家今年夏天,数据分析师在对阿里巴巴内衣销售数据分析后发现,购买大号内衣的女性往往更败家。在将这些内衣购买者的消费数据进行整理后,分析师发现,65%B罩杯的女性属于低消费顾客,而C罩杯及以上的顾客大多属于中等消费或高消费买家。 金牛最持家射手最败家吃喝玩乐哪家强?数据显示,双十一当日,在手机QQ吃喝玩乐中,金牛座领用优惠券和购买团购平均折扣低至2.9折,“最会吃喝玩乐”的桂冠当之无愧,而巨蟹座、处女座分别以3.2折、3.3折屈居亚军和季军。如此力度的折扣,看来金牛们在默默辛苦工作的同时,还是居家过日子的典型。有最会省钱的星座,必然也会有败家的星座。在双11当日吃喝玩乐的消费人群中,最败家的星座当属射手座,占11%。“省钱不是目的,关键是玩得嗨皮。”射手座在消费的时候将乐观开朗的性格彰显的淋漓尽致,成为十二星座中为11.11贡献最多的星座。白羊座下手最快双鱼座最爱晒在折扣面前,动作快才能将最优惠的商品抢到手,理智型消费者肯定占不了上风。从领红包到消费,对于精力充沛到过剩,行动执行力最强的白羊座来说,80%用户都在30秒内完成,秒杀一片。原来白
softmax_cross_entropy_with_logits与sparse_softmax_cross_entropy_with_logits都是对最后的预测结果进行softmax然后求交叉熵 区别在于输入的label形式 sparse_softmax_cross_entropy_with_logits的label是[batch_size], softmax_cross_entropy_with_logits的label是[batch_size,classes],也就是需要对label进行onehot编码 参考:https://stackoverflow.com/questions/37312421/whats-the-difference-between-sparse-softmax-cross-entropy-with-logits-and-softm
之前我常用的编程工具是UltraEdit和Editplus,UltraEdit里强大的搜索和大文本加载功能是我喜欢的。但这两款文本编辑器是收费的,我一直用破解版的心里有鬼。自从发现了SublimeText这款免费编辑器后,它就成了我爱不释手的优先选择的编程工具。SublimeText强大的语法自动提示功能是我最看重的一点,我经常会编辑一些HTML代码,HTML代码里的所有语法标记,它都能提供自动补全,还能提示所有CSS属性的可选属性值,极大的方便了HTML和CSS开发。 SublimeText提供了非常自由的插件(plugins)扩展功能。我最近出现了一个小小的需求,想开发出一个简单的扩展功能。我想在SublimeText的系统菜单里添加一个新的菜单,叫做“HTML尖括号转换”,但当点击它后,编辑器里HTML文本中的所有尖括号(>和<)都将会转换成>和<。WEB程序员应该知道这个功能的用武之地。 开发这个插件非常的简单。只需要几行代码。但更复杂的插件也都是这种简单插件基础上扩展出来的。下面我将要介绍开发这个插件需要的步骤和方法。 首先,你需要懂一
分布式 分布式产生于海量数据的背景下。当数据非常庞大,单台服务器根本无法处理的时候,必需使用分布式。新摩尔定律,根据IDC作出的预测,数据一直都在以每年50%的速度增长,也就是说每两年增加一倍,这意味着人类在最近两年产生的数据量相当于之前产生的全部数据量。分布式环境下的RPC调用速度更慢,差不多是单机环境的100倍;但可以通过扩展,使性能线性增长。分布式存储是云存储和大数据的基础。 分布式关注点 分布式存储涉及的技术主要有:数据分布,均匀分布;自动容错,备份;一致性;分布式事务;负载均衡,新增服务器和集群运行中实现负载均衡。 数据模型 文件模型、对象模型、键值模型、关系弱化的表格模型、关系模型 1、分布式文件系统,存储图片、照片、视频等非结构化数据对象,这类数据以对象的形式组织,对象之间没有关联,这样的数据一般称为Blob(BinaryLargeObject,二进制大对象)数据。2、对象模型与文件模型比较类似,用于存储图片、视频、文档等二进制数据块,AmazonSimpleStorage(S3),TaobaoFileSystem(TFS),这些系统弱化了目录树的概念。3、分布式键值
毕业汪今年要毕业啦,毕设做的是三维模型草图检索,年前将算法移植到移动端做了一个小应用(利用nodejs搭的服务),正好也趁此机会可以将前端的Canvas好好学一下~~毕设差不多做完了,现将思路和代码进行回顾整理,希望以最简单的方式将核心前端部分总结并呈现。 Canvas绘画应用 采用webpack、ES6、HTML5、jQuery构建,利用了移动端的触摸和手势事件,结合Canvas,实现在移动端的绘画功能。 先从简单的小绘图功能开始实现,后面有新的功能进行迭代实现。 采取的CSS规范 规范参考 OOCSS:结构(structure)与表现(skin)分离,容器(container)与内容(content)分离 BEM:类似于组件化的概念,独立的元素搭积木拼接 基础目录结构 paintApp/ asset/ css/ img/ src/ common/ component/ app.js index.html package.json webpack.config.js 基础功能实现 ☞index.html <canvasclass="painter"id
前言 我们已经知道了TypeScript是什么,以及为什么要用TypeScript,今天,我们就来学习怎么初步使用它。 TypeScript的使用流程 原始的TypeScript文件以.ts结尾,它不能被直接使用到页面中,需要经过编译,转换成JavaScript(.js)文件才行。 TypeScript的使用流程基本上如下图所示: 编译TypeScript文件的这一步,我们使用的是前面安装的全局TypeScript模块,编译指令为: tscindex.ts 复制 通过这一步的编译之后,会在index.ts同级目录下生成一份index.js文件,我们最终在页面中使用的就是编译产生的JavaScript文件。 我们在前面说过,TypeScript是静态的,会在编译过程中进行数据类型、语法等的检测,如果发现错误会立即报错,比如我们编译下面的TypeScript代码: //index.ts leta:number=12; a="编程三昧"; 复制 产生如下报错: 虽然编译阶段发生了报错,但最终还是会生成一份JavaScript文件: //index.js vara=12; a="编程三昧
?关注微信公众号,获取更多编程内容 原文链接Netty核心内容之编解码器 代码仓库地址 编解码器 我认为Netty最棒的一点就是Netty设计的编解码链,这一优秀的设计,可以很方便的实现二进制流->ByteBuf->Message对象,反之编码器也是如此.那么下面有一些总结的记录。 各种编解码器本质上是一个ChannelHandle处理器 解码器(又称之为入站处理器)的顶层父类是ChannelInboundHandler,编码器(又称之为出站处理器)的顶层父类是ChannelOutboundHandler. 我们向网络中写入数据的时候,不管是什么类型,基本类型或者是类类型,最终都是转换为字节流的形式传递。那么在Netty中,其预置了一个ByteBuf的编解码器,他可以将网络中的二进制转换为ByteBuf(或者反之),这样我们的最终目的只要将Message转换为ByteBuf(或者反之)即可,将Message转换为ByteBuf的过程称之为编码Encoder,ByteBuf转换为Message的过程称之为解码Decoder,两者统称为编解码,codec 编码本质上是一
Vue初级 过滤器 作用:过滤数据 例如:2022-08-02转换成2022/08/02 10元转换成¥10 1.声明过滤器 newVue({ el:'', data:{ //实参数据,filters会接收 }, filters:{ 方法名(形参){ 方法体 return过滤后的结果 注意:关于这个返回值,一定要有返回值,如果没有的话,页面不会渲染任何效果 返回的数据就是过滤后的数据,经过返回后,就会在页面上渲染过滤后的数据 } } }) 2.使用过滤器 <divid='app'> {{要过滤的数据|过滤器方法名}} //表示:使用过滤器里面的方法过滤数据 //过滤后的内容再次过滤 {{要过滤的数据|过滤器方法名1|过滤器的方法2}} </div> 复制 自定义指令 1.声明的语法格式: newVue({ el:'', directives:{ '自定义指令名':{ //bind触发时机:当自定义指令被使用的时候会自动触发该函数 bind(el,binding){ el:绑定该指令的标签, binding:{name:'自定义指令名',rawNam
前段时间碰到个问题jqueryUIdialog弹出层弹出多个层是比如弹出两个层A和B B层如果显示的数据表格太大,伸到了A层的外面,那伸到A层之外的部分就看不到了,因为B层是在A层上弹出的B的大小受到A层大小的限制 于是找到了这个资料保存下来 ----------------------------------------------------------------------------------------------------- 初始化参数 对于dialog来说,首先需要进行初始化,在调用dialog函数的时候,如果没有传递参数,或者传递了一个对象,那么就表示在初始化一个对话框。 没有参数,表示按照默认的设置初始化对话框,在当前最新版本的jQueryUI 1.8.9中, dialog支持下列属性。 autoOpen 初始化之后,是否立即显示对话框,默认为true modal 是否模式对话框,默认为false closeOnEscape&nb