规模化微服务——《微服务设计》读书笔记

改变思维的角度:故障无处不在

      当微服务规模化后,故障是无可避免的,以往我们总是想尽力避免故障的发生,而当故障实际发生时,我们往往束手无策。我们花了很多时间在流程设计和应用设计的层面上来阻止故障的发生,但实际上很少花费时间思考如何第一时间从故障中恢复过来。

      一些公司喜欢组织活动,活动当天系统会被关掉以模拟故障发生,然后不同团队演练如何应对这种情况。这些项目中最著名的是混乱猴子(Chaos Monkey),在一天的特定时间随机停掉服务器,这促使开发人员在构建系统时不得不为它做好准备。猴子军队可以在系统中注入网络延迟,也可以随机关闭整个可用区,这可以让你的系统得到终极验证。SimianArmy就是这样的一个项目。

      通过让软件拥抱和引发故障,并构建系统来应对。

 

了解什么指标是我们必须关注的

      企业Wiki一个月发生故障两天,我们认为是可以接受的,电商网站一天停一个小时也是不可接受的。我们需要正确地理解这些需求,以便采取合适的技术。

      我们建议有一些默认的指标必须予以关注。

      1.响应时间/延迟

      鉴于网络的性质,你经常会遇到异常值,所以将监控的响应目标设置成一个百分比是合理的。

      举例:我期望这个网站,当每秒处理200个并发连接时,90%的响应时间在2秒以内。

      2.可用性

      评价可用性,我们可以从历史报告来分析,以跟我们的期望值相对比。

      3.数据持久性

      用户的登录会话只需要保持一年,金融交易记录则需要保存很多年。

 

一.从体验上来解决:功能降级

      当购物车功能不可用时,你可以隐藏掉这个图标,并提示“马上”,或者变成一个可下单的电话号码。

      对于每个使用多个微服务的面向用户的界面,或每个依赖多个下游合作者的微服务来说,你都需要问自己“如果这个微服务宕掉会发生什么”,然后你就知道该如何做了。

 

二.从请求/响应上来解决

      1.超时机制

      给所有的跨进程调用设置超时,当发生超时时记录到日志中,并相应地调他们。

      2.断路器

      当对下游的请求发生一定数量的失败后,断路器会打开,接下来,所有的请求在断路器打开的情况下会快速地失败,一段时间后,客户端发送一些请求查看下游服务是否已经恢复,如果它得到了正常的响应,将重置断路器。

使用断路器,我们可以在请求失败后把这些请求存起来,然后稍后重试它们,也可以直接使用功能降级。Hystrix就是一个基于JVM的开源断路器。

      3.舱壁

这是一种把自己从故障中隔离开的方式,如果我们使用下游多个服务,而其中一个服务占用了过多的连接池,由于是共用连接池,这势必会对其他的服务调用造成影响,舱壁的处理办法,即是为每个下游服务建立一个单独的连接池,我们当然也可以跟断路器联合起来使用。

      在很多方面,舱壁是三个模式中最重要的,超时和断路器能够帮助你在资源受限时释放它们,但舱壁可以在第一时间确保它们不成为限制,它可以拒绝请求以避免资源达到饱和。

 

三.从服务依赖性上解决:隔离

      一个服务依赖于另一个服务,另一个服务的健康将能影响其正常工作的能力,如果我们使用的集成技术允许下游服务器离线,上游服务便不太可能受到计划内或计划外宕机的影响。

      Jekins的master/slave即是这样的解决思路。

 

四.从处理结果上解决:幂等

      对幂等操作而言,多次执行所产生的影响均与一次执行的同,如果操作是幂等的,我们可以对其重复多闪调用,而不必担任会有不利影响。当我们不确定否被执行,想要重新处理消息,从而从错误中恢复时,幂等会非常有用。

 

五.从应用上解决:扩展应用

      更强大的主机、一台主机一个微服务、关键业务弹性部署、多云服务数据商备份、异地灾备、负载均衡、重构系统、作业队列。

 

六.从数据库上解决:扩展数据库

      方法1:主从复制

      当主数据库出现故障,可以马上启动备份数据库,并提升至主数据库。

      方法2:读写分离——扩展读操作

      读操作使用的数据库和写操作使用的数据库分开,但这会造成数据暂时不一致的情况。

      方法3:读写分离——扩展写操作

      可以使用分片的方式来扩展写操作,当你有一块数据要写入时,对数据的关键字应用一个哈希函数,并基于这个函数的结果将数据发送到哪个分片。

      但分片扩展会导致在查询上复杂起来,如果要查询所有年满18岁的顾客,那么要查询所有分片,然后在内存中拼起来;或者有一个替代的读数据训包含所有的数据集。

      分片扩展的另一个问题是,如果想添加新的数据库节点,我们需要大量的宕机时间然后重新分配数据

      方法4:CQRS——命令查询职责分离

      在传统的系统中,数据的修改和查询使用的是同一个系统,使用CQRS后,系统的一部分负责获取修改状态的请求命令并处理它,而另一部分则负责处理查询。

 

七.从缓存上解决:缓存

      1.客户端、代理服务器和服务器端缓存

      使用客户端缓存,客户端会缓存存储的结果,由客户端决定何时获取最新副本。我们可以通过服务来告诉客户端应该更新缓存了。

      代理服务器缓存,将一个代理服务放在客户端和服务端之间,反向代码或CDN就是这样的例子。

      服务器缓存,由服务器端处理缓存,Redis、Memcache、内存缓存就是这样的系统。

      2.HTTP缓存

      标准的静态网站,像CSS或图片,很适合用HTTP中的cache-control和Expires指令,另外还可以使用HTTP的ETag来标示资源是否已改变,如果我更新了客户记录,      虽然访问资源的URI相同,但值已经不同,所以我会改变ETag。

      3.使用写缓存

      你可以先写入本地缓存,并在之后的某个时刻将缓存中的数据写入下游,当你有爆发式的写操作时,或同样的数据可能被写入多次时,或下游服务不可用时,这种方式都是很有用的。

      4.为弹性使用缓存

      我们可以缓存一个时间点的数据,在故障发生时提供这个时间点的数据,虽然可能不完全正确,最起码可以用。

      5.隐藏源服务

      有可能我们系统的80%请求都是通过缓存,那么缓存一旦失败,请求都将进入源服务,源服务从来没有处理过这么多请求,这将是灾难性的,我们可以阻塞请求,并在后台异步重建缓存。

      6.避免过多地使用缓存

      缓存越多,就越难评估数据的新鲜程度。

      7.防止缓存中毒

      你可能在系统中将HTTP缓存头的过期时间设置为Expires:Never,这样除非用户手工清除他们(也许CDN也会缓存这些内容),否则永远不会失效,这时我们唯一的选择就是:改变这些网页的URL,以便能够重新获取它们。

 

使用自动伸缩

      现在的云服务提供商允许你制定自动伸缩服务的策略,通过响应式伸缩或者预测式伸缩帮助你在高峰(有可能是秒杀,有可能是突发式新闻,也有可能是因为周末)到来的时候提供服务。

 

CAP理论

      Eric Brewer的CAP理论告诉我们,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance),最多只能同时保证三个中的两个。

 

 

      牺牲一致性:

      我们只需要数据保持最终一致就可以了,因为我们需要分区来保证数据的安全性,同时保证系统的可用性。博客园我更新博客时,每个月份的博客统计数不会马上更新就是这样。

      牺牲可用性:

      像12306这样的网站每天晚上维护就是牺牲了可用性。

      牺牲容忍性:

      既然是分布式系统,这种情况是肯定不存在的。

 

服务发现、注册与编排

     方法1:DNS

      DNS让我们将一个名称与一个或多个机器的IP地址相关联,例如我们可决定在accounts.hello.com上发现账户服务,这个域名会关联到运行该服务的主机的IP上或负载均衡器上。

      DNS的好处在于它是,但不好的地方在于更新它不是那么容易,而且对于一个新的节点,DNS不能“发现”这个节点。

      方法2:Zookeeper

      它支持配置管理、服务间的数据同步、leader选举、消息队列和命名服务。它的核心是提供了一个用于存储信息的分层命名空间,客户端可以在此层次结构中,插入新的节点,更改或查询它们。

      方法3:Consul

      它也支持配置管理和服务发现,但它比Zookeeper更进一步,为这些关键使用场景提供了更多支持,如它为服务发现提供了一个HTTP接口,另外它提供了现成的DNS服务器。

      Consul还内置了一些功能,如对节点执行健康检查的能力。

      Consul从注册服务、查询键/值存储到插入健康检查,都使用的是RESTful HTTP接口,这使集成不同技术栈变得简单。

      方法4:Eureka

      它提供了基本的负载均衡功能,它可以支持服务实例的基本轮询调度查找,它提供了一个基于REST的接口,因此你可以编写自己的客户端。

 

文档服务

      微服务非常多,暴露的接口更多,我们希望知道关于这些接口的说明,理想情况下我们会确保文档总是和最新微服务的API文档同步,并当大家需要知道服务在哪里,能够很容易地看到这个文档。

      1.Swagger

      Swagger让你描述API,产生一个很友好的Web用户界面,使你可以查看文档并通过Web浏览器与API交互,还可以直接执行请求。

      2.HAL和HAL浏览器

      它是用媒体来生成我们的文档。

 

参考

      《微服务设计》(Sam Newman 著 / 崔力强 张骏 译)

相关文章: 

  • 微服务的概念——《微服务设计》读书笔记

  • 微服务架构师的职责——《微服务设计读书笔记》

  • 建模:确定服务的边界——《微服务设计》读书笔记

  • 微服务集成——《微服务设计》读书笔记

  • 服务的协作:服务间的消息传递——《微服务设计》读书笔记

  • 拆分:分解单块系统——《微服务设计》读书笔记

  • 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

  • 测试——《微服务设计》读书笔记

  • 监控——《微服务设计》读书笔记

  • 安全——《微服务设计》读书笔记

  • 康威定律和系统设计——《微服务设计》读书笔记

原文地址:http://www.cnblogs.com/gudi/p/6686277.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle基础

一、Oracle简介: 1.版本:8i/9i-10g/11g(目前我们使用的是11g) 二、数据库: 1.在物理上表现为数据文件、日志文件和控制文件等。 2.在逻辑上以表空间的形式存在 3.首先需要创建数据库才能使用oracle 三、数据库实例: 每个启动的数据…

一个致命的 Redis 命令,导致公司损失 400 万

转载自 一个致命的 Redis 命令,导致公司损失 400 万 最近安全事故濒发啊,前几天发生了《顺丰高级运维工程师的删库事件》,今天又看到了 PHP 工程师在线执行了 Redis 危险命令导致某公司损失 400 万。。 什么样的 Redis 命令会有如此威力&a…

JS中的基本和引用类型传递的比较

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">/** 基本数据类型* String Number Boolean Null Undefined* * 引用数据类型* Object* * JS中的变量都是保…

oracle应用

一、使用jdbc连接oracle数据库&#xff1a; 1.将ojdbc6.jar放在lib中 2.将ojdbc6.jar右击–》build path–>add build path 3.加载驱动&#xff1a; Class.forName(“oracle.jdbc.driver.OracleDriver”); 4.建立连接: Connection conn DriverManage.getconnection(“jdbc:…

./NISwGSP: error while loading shared libraries: libopencv_stitching.so.3.0: cannot open shared obje

error while loading shared libraries: libopencv_highgui.so.3.0: cannot open shared object file: No such file or directory 找不到需要的库。 locate libopencv_imgcodecs.so.3.0 查找这个库的所在目录&#xff0c;发现在/usr/local/opencv-3.0.0/目录下 在/etc/ld.s…

如何在 ASP.NET Core 中发送邮件

前言 我们知道目前 .NET Core 还不支持 SMTP 协议&#xff0c;当我么在使用到发送邮件功能的时候&#xff0c;需要借助于一些第三方组件来达到目的&#xff0c;今天给大家介绍两款开源的邮件发送组件&#xff0c;它们分别是 MailKit 和 FluentEmail &#xff0c; 下面我对它们…

一文搞懂 Java 线程中断

转载自 一文搞懂 Java 线程中断 在之前的一文《如何"优雅"地终止一个线程》中详细说明了 stop 终止线程的坏处及如何优雅地终止线程&#xff0c;那么还有别的可以终止线程的方法吗&#xff1f;答案是肯定的&#xff0c;它就是我们今天要分享的——线程中断。 下面…

JS对象的属性名规则

/* * 使用对象字面量&#xff0c;可以在创建对象时&#xff0c;直接指定对象中的属性 * 语法&#xff1a;{属性名:属性值,属性名:属性值…} * 对象字面量的属性名可以加引号也可以不加&#xff0c;建议不加, * 如果要使用一些特殊的名字&#xff0c;则必须加引号 * * 属性名和属…

shell文本处理工具grep

shell脚本之grep工具 grep是 行 过滤工具&#xff1b;用于根据关键字进行行过滤。语法和选项 语法&#xff1a; #grep [选项] ‘关键字’ 文件名 常见选项 OPTIONS -i &#xff1a;不区分大小写 -v &#xff1a;查找不包含指定内容的行&#xff0c;反向选择 -w&#xff1a…

数据访问层

一、持久化&#xff1a; 1.概念&#xff1a;将程序中的数据在瞬时状态和持久状态之间的转换机制。 二、持久化实现的方式&#xff1a; 1.数据库 2.普通文件 3.XML文件 三、持久化的操作&#xff1a; 添加 修改 删除 查找 读取 四、Dao&#xff1a; 实现对持久化数据的访问。 五…

.NET的一点历史故事:招兵买马和聚义山林

曾几何时&#xff0c;Java 的兴起得益于众多大公司的涌入&#xff0c;Sun、IBM、SGI、网景、甲骨文、Borland 都在第一时间关注并投入大量资源来推动它的发展。比较典型的例子就是 IBM 做了自己的 Java SDK&#xff0c;并且做出了 SWT 界面框架&#xff0c;后面又开源了自己的 …

教你用 3 台机器搞定一个 Redis 高可用架构

转载自 教你用 3 台机器搞定一个 Redis 高可用架构 基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了。 我们经常在业务中用其存储用户登陆态&#xff08;Session 存储&#xff09;&#xff0c;加速一些热数据的查询&#xff08;相比较 MySQL…

调用函数的返回值和函数对象本身

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>function fun3() {function fun4() {alert("我是fun4");}//将fun4函数对象…

Mybatis主要内容

mybatis 框架 共四天 第一天 mybatis入门 mybatis的概述 mybatis的环境搭建 mybatis入门案例 自定义mybatis框架&#xff08;目的为了了解mybatis中执行细节&#xff09;。 第二天 mybatis基本使用 mybatis的单表crud操作 mybatis的参数和返回值 mybatis的dao编写 mybatis配置细…

使用java解析XML文件的步骤

以前的时候&#xff0c;也解析过&#xff0c;今天又拿出来解析就让忘记怎么解析了&#xff0c;后来在网上查还有自己想&#xff0c;终于解析出来了&#xff0c;下面就是原XML文件&#xff1a; accp.xml <?xml version"1.0" encoding"UTF-8"?> <…

世界上最大的搜索引擎公司 Google 宣布与 Elastic 达成战略合作协议

和大家的直觉反应比较不同&#xff0c;但谷歌&#xff0c;这家业界首屈一指的互联网搜索公司&#xff0c;要向她的云平台里加入新的搜索服务了。谷歌云平台一直向企业客户出租计算、存储和网络等服务&#xff0c;现在谷歌则要与Elastic公司合作&#xff0c;为谷歌云提供新的搜索…

sleep( ) 和 wait( ) 的这 5 个区别,你知道几个

转载自 sleep( ) 和 wait( ) 的这 5 个区别&#xff0c;你知道几个 sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法&#xff0c;它们有什么区别及一些该注意的地方有哪些呢&#xff1f;下面给大家一一分解。 区别1&#xff1a;使用限制 使用 sleep 方法可以…

MyBatis_1 简介

1、什么是框架&#xff1f;它是我们软件开发中的一套解决方案&#xff0c;不同的框架解决的是不同的问题使用框架的好处&#xff1a;框架封装了很多的细节&#xff0c;使开发者可以使用极简的方式实现功能。大大提高开发效率。 2、三层架构 表现层&#xff1a;是用于展示数据的…

使用java读取文件并输出

通过Reader读取文件中的内容&#xff1a; 下面是文件&#xff1a; test.txt: 1、看着街上的人群&#xff0c;各个都把自己捂得严严实实的&#xff0c;好似一个个奇怪的布包裹。窗外的天&#xff0c;是灰蒙蒙的一片&#xff0c;灰色的霾把所有的物体都笼罩了起来。2、它来时&am…

Akka系列---什么是Actor

本文已.Net语法为主,同时写有Scala及Java实现代码 严肃的说,演员是一个广泛的概念,作为外行人我对Actor 模型的定义: Actor是一个系统中参与者的虚拟人物,Actor与Actor之间是可以相互沟通,所有的沟通都是通过Message 比如说一个呼叫中心,数以百万计的客户可能会呼叫一个1-800的…