彩票365下载_彩票365官网app|官网手机购彩

彩票365官网手机购彩技术

当前位置:彩票365下载 > 彩票365官网手机购彩技术 > 架构干货,给中高端开垦者

架构干货,给中高端开垦者

来源:http://www.aysygc.com 作者:彩票365下载 时间:2019-08-21 08:44

原标题:架构干货:来听听架构大师 Martin Abbott 怎么说

本篇通过阅读《高扩展性网站的50条原则》,总结出以下内容。

一方面博主没有实际的架构经验,另一方面知识面也不够宽阔,所以只能系统的总结书中的要点,并根据自己的理解做些归纳。

典型 Web App 架构

本文首先介绍微服务架构存在的风险,然后针对如何避免微服务架构的故障,提出了多种有效的微服务架构中的方法和技术,其中例如服务降级、变更管理、健康检查和修复、断路器、限流器等。

本篇目录

  • 早期阶段就要对应用进行负载测试
  • 使用高性能类库
  • 你的应用是CPU密集还是IO密集的
  • 使用基于Task的异步模型,但要慎重
  • 分发缓存和会话状态
  • 创建Web Gardens
  • 巧妙地使用缓存和懒加载
  • 不要在MVC视图中放C#代码
  • 适当时使用Fire & Forget
  • 为x64 CPU创建
  • 使用服务器上的监视和诊断工具
  • 分析运行中的应用

如果你在构建一个面向公众的web站点,那么在项目结尾时你想要实现的就是web负载性能良好。这意味着,你要确保你的产品在高负载下(50个并发用户或者每秒200个用户等等)能够运行,即使你认为此时不会有那么大的负载。久而久之,你的web站点可能吸引越来越多的用户,此时如果web的负载难以让人忍受时,那么自然而然网站开始走下坡路,意味着客户流失以及名誉受损。

那么可以采取哪些措施可以使得一个ASP.NET或者ASP.NET MVC应用更加高性能呢?

架构扩展性的13条最佳实践

主要内容

  本书从多个方面围绕高扩展性提出了50条建议,一个高扩展性的网站会随着业务的发展、用户的增加,自由的扩展架构,从而轻松的应付网站的快速发展。下面看看本书的具体内容:

图片 1

图片 2

目录

早期阶段就要对应用进行负载测试

大多数开发者趋向在应用开发完成后,集成测试和回归测试通过后才进行负载测试。尽管在开发完成后执行一次负载测试好过不做,但是一旦完成了代码的编写,修复性能问题就为时已晚了。这个问题最常见的例子就是当应用程序在负载测试时不能正确响应时,就会考虑向外扩展。有时这是不可能的,因为代码不适合实现扩展服务器。比如当对象是存储在Session中并不可序列化时,这样添加更多的web节点或者工作者进程就是不可能的。如果你在开发的早期阶段就发现你的应用可能要部署到多台服务器上,那么你应该在配置和服务器的数量等方面都要让测试环境和最终环境尽可能地接近,这样你的代码会更容易适应。

以下内容节选自:世界级软件架构大师 Martin Abbott 亲研架构秘籍《突破技术领导力》

化简方程

  1 不要过度的设计

  过度的设计相当于给系统增加了复杂度与维护的成本。而这些过度的设计,在正常的使用中,却没有太大的作用。往往是设计者自己认为很重要或者锦上添花的功能,实际用处不大。

  2 设计时考虑到扩展性

  在设计时要遵循一下的设计原则:设计时考虑20倍的容量,实现时考虑3倍的容量,部署时考虑1.5的容量。一面项目扩大时,临时扩展造成的困难。

  3 把方案一简再简

  应该遵循帕累托法则,20%的设计做了80%的工作,所以80%的时间,都应该放在这20%的设计上。

  一个产品主要的功能其实都集中在几个点上,把这几个点设计好了,其他的都是些附加的功能而已。所以这核心的业务一定要保证足够的简洁易用。

  4 减少DNS查询

  每个不同的域下的文件,加载时都需要查询DNS。比如cnblogs.com与i.cnblogs.com就属于不同的域。那么在查询DNS的时候,就会查询两次。当业务量很大时,就会造成一定的影响。

  5 尽可能减少对象

  由于对象在浏览器访问时,需要加载。所以可以考虑减少请求文件的数量(数量与浏览器并发加载数有关),把一些对象尽量的合并。比如图标类的文件,可以合并成一个大的图片。合理的文件数量,会加速浏览器的访问加载。

  6 使用同一品牌的网络设备

  由于一个http请求,可能通过很多物理设备。比如负载均衡器,交换机,路由器。所以尽量使用同一品牌的设备,会避免一些意外的情况。

反向代理服务

1、微服务架构的风险

使用高性能类库

近来我在诊断web站点的性能问题时发现了代码中的一个热点问题:来自第三方web服务的JSON信息必须要被反序列化多次。那些Json信息是由Newtonsoft.Json反序列化的,并且证明了Newtonsoft.Json在反序列化时不是最快的类库,然后我们使用了一个更快的类库(如ServiceStack)替代了Json.Net,并获得了更好的结果。

如果我们在挑选了Json.Net作为序列化类库的早期阶段就完成了负载测试,那么我们就会更早地发现性能问题,我们就不必再代码中做这么多的修改了,也不必再次完整地重新测试了。

1. 尽可能多地使用异步的通信方式

分布工作

图片 3

  7 X轴,横向复制

  这种事最简单的服务扩充,通过克隆或者复制实现,比如你的应用放在多个服务器上进行服务。常见的比如集群,负载均衡等等,数据库的读写分离。

  8 Y轴,拆分不同的东西

  大型系统中,拆分不同的功能,比如注册、购买、查询、云盘。等等

  9 Z轴,拆分不同的相似的东西

  比如按照用户的级别,或者用户的地理位置等等拆分。

以下是一个典型的高负载 web 应用示例:上图展示了一个典型的,三层架构的高性能 Web 应用。这种成熟的架构多年以来已被广泛部署于包括 Google、Yahoo、Facebook、Twitter、Wikipedia 在内的诸多大型 Web 应用中。

2、优雅的服务降级

你的应用是CPU密集还是IO密集的?

在开始实现web应用以及设计项目时,你要首先考虑的一件事就是你的应用是CPU密集的还是IO密集的?这对于了解扩展应用的策略是很重要的。

比如,如果你的应用是CPU密集的,那么你可能想使用同步模式,并行处理等等。然而,对于一个有很多IO受限的操作(例如和外部web服务或者网络资源如数据库通讯)的产品,基于Task的异步模式可能对于向外扩展更有帮助。此外,为了在未来的某天能够创建Web Gardens和Web Farms,你可能想有一个集中式的缓存系统,这样就实现了跨越多个工作者进程或服务的负载。

同步调用会同时将两种不同服务的可用性捆绑在一起。如果其中一者产生错误或是堵塞,另一者也会受到影响。

横向扩展设计

  10 设计横向的扩展方案

  扩展包括横向、纵向。横向就是通过复制克隆应用,利用小型机集群扩展。纵向就是提高服务器的硬件以及网络设施。

  通过很多的案例都可以发现,单纯的升级硬件实现的纵向扩展,仅仅能解决一点点现实压力。而通过横向的集群扩展,却能够自由的实现伸缩。

  11 采用经济型系统

  与上面的原则类似,采用高价格的服务器,并不能保证日后的良好性能。应该使用普通的小型机集群扩展。

  12 横向扩展数据中心

  数据中心有很多的设计方案,比如

  热冷站配置:使用热站提供服务,当热站崩溃时,使用冷站继续服务。

图片 4

  推荐使用多个实时站点,成本更低,动态调用。缺点是增加了运维的难度。

  13 利用云技术进行设计

  云计算的有点就是虚拟化,可以在业务峰值时,弹性的扩充设备。并且在日常处理用,归还该扩展。

  缺点是提高了应用于虚拟环境的耦合。后面提到利用物理设备,隔离业务,在虚拟化的云计算中,可能会对业务隔离错误排查造成一定的干扰。

位于三层构架中最外层的反向代理服务器负责接受用户的接入请求,在实际应用中,代理服务器通常至少还要完成以下列表中的一部分任务:

3、变更管理

使用基于Task的异步模型,但要慎重

如果你的产品依赖许多IO受限的操作,或者包括了可能需要消耗宝贵的IIS线程等待一个操作完成的长时间运行的操作,你最好为ASP.NET MVC项目考虑使用基于Task的异步模式。

互联网上有很多关于异步的ASP.NET MVC actions的手册(比如这个),所以这篇博客尽量避免介绍关于异步的知识点。然而,必须指出ASP.NET 中传统的同步action会造成IIS线程繁忙直到操作完成或请求处理完成。这意味着如果如果web应用在等待一个外部的资源响应,那么该线程将是繁忙的。.Net线程池中可以用于处理请求的线程数量也是有限的,因此,尽可能快地释放线程是很重要的。基于Task的异步action或方法会在请求处理后释放该线程,然后从线程池中获取新的线程,并使用该新的线程返回该action的结果。这样,多个请求可以由多个线程处理,这会为你的应用带来更好的响应。

虽然TAP模式对于适当的应用来说很方便,但必须要慎重使用。当你使用TAP设计或者实现一个项目时,必须要注意几个点(你可以点击这里查看),然而,开发者使用async和await关键字面临的最大挑战是知道在这个上下文中他们必须略有不同地处理线程。比如,可以创建一个返回Task(如Task《Product》,博客园的markdown不支持单尖括号)的方法,通常你可以对那个Task调用Run()方法或者只调用task.Result来迫使运行该task,直到拿到结果。

2. 使用用户泳道来隔离错误

使用正确的工具

  14 合理使用数据库

  目前有许多的数据库版本,比如传统的关系型数据库Oracle、MySQl,还有比较新的非关系型数据库NoSql,比如MongoDB,以及内存数据库FastDB,还有专门针对SSD固态硬盘的Aerospike等等。

  但是到了选型的时候,还是要一句个人的业务需求来定。看你的数据库要求的是速度,还是安全性等等。

  15 防火墙,到处都是防火墙

  防火墙可以对一些无效的访问进行拦截过滤。通常把一些CSS,静态文件,图片,JS等不采用防火墙,而关键的业务涉及到个人信息时采用。合理的设计防火墙,也会对网站的性能产生一定的影响。

  16 积极的利用日志文件

  利用各种日志以及工具,实时的监控业务。不仅仅是监控服务器的内存CPU,还应该监控业务上的数据。比如splunk(提供日志的搜集,存储,搜索,图形化展示)。

连接管理:分别维护客户端和应用服务器的连接池,管理并关闭已超时的长连接。

4、健康检查和负载均衡

分发缓存和会话状态

开发者在单个开发机器上构建一个web应用是非常常见的,并且也会假设该产品运行在单个服务器上,然而对于面向大众的web通常不是这样的。它们往往被部署到一个叫做负载均衡之后的多个服务器上。尽管你仍然可以使用In-Proc(关于In-Proc和Out-Proc的知识点补充)的模式和粘性Session将一个web应用部署到多个服务器上(负载均衡器会将属于相同session的所有请求定向到单个服务器),你可能必须保留session数据和缓存数据的多个副本。比如,如果你将产品部署到由4台服务器组成的web farm上,并且你保持session数据为In-Proc,那时一个请求到达一个已经包含缓存数据的机会是四分之一或25%,然而你如果在正确的地方使用了集中式缓存机制,那么为每个请求找到缓存条目的机会就是100%。这对于严重依赖缓存数据的web应用是至关重要的。

图片 5

使用集中式缓存机制(像App Fabric或Redis)的另一个好处是对实际的产品实现主动缓存系统的能力。主动缓存机制可以用于在客户端请求一个条目之前就可以将最受欢迎的条目预加载到缓存中。如果你使用实际的数据源来管理缓存同步时,那么这会帮助你大幅地改善大数据驱动应用的性能。

根据用户划分来创建硬件隔离的“泳道 Swim Lanes”。这可以防止因为某个客户所产生的问题而影响其他客户,同时有助于诊断问题和代码发布。

不要做重复的工作

  17 不要立即检查刚做过的工作

  比如刚刚写如了数据,不要立即读取。虽然有些客户需要保证数据的完整,不能丢失。但是可以通过日志等记录,写完查这种做法,还是不推荐。

  18 停止重定向

  重定向会消耗一定的延迟,计算资源。应该尽量避免

  19 放松时序约束

  大多数的关系型数据库讲究ACID属性,扩展时就造成一定的困扰。因此某些业务适当的放松时序约束,可以提高网站的性能。

  比如某站在预定酒店时,用户预定后,会等待酒店的审核。比如某宝,在提款时,进行范围时间的确认。这种就是扩大了时序约束,进而提高网站性能以及事务安全。

攻击检测和安全隔离:由于反向代理服务无需完成任何动态页面生成任务,所有与业务逻辑相关的请求都转发至后端应用服务器处理。因此反向代理服务几乎不会被应用程序设计或后端数据漏洞所影响。反向代理的安全性和可靠性通常仅取决于产品本身。在应用服务的前端部署反向代理服务器可以有效地在后端应用和远程用户间建立起一套可靠的安全隔离和攻击检测机制。

5、自我修复

创建Web Gardens

之前提到,在一个IO受限的web应用中包含了很多长时间运行的操作(如web服务的调用),此时你可能想尽可能地释放主线程。默认情况下,每个web应用运行在一个主线程下,该主线程为保持web站点存活负责,但不幸的是,当它太忙的时候,你的站点就变得不能响应了。给应用添加更多的“主线程”是一种办法,这是通过将更多的工作者进程添加到IIS下的Web站点来实现的。每个工作者进程都会包括一个单独的主线程,因此,如果一个主线程繁忙,还有另外的主线程来处理到来的请求。

拥有多个工作者进程会将你的web站点变成一个Web Garden,这要求你将Session和应用数据持久化到Out-Proc中(例如一个state server或者Sql Server)。

图片 6

图片 7

积极利用缓存

  20 利用CDN

  可以利用CDN保存客户的数据和内容。大概的过程是,用户在进行网站访问时,转到CDN的服务器,CDN执行DNS查询,把用户请求分摊到不同的服务器。有很多的CDN服务商提供这种服务。

  21 使用过期头

  针对不同的对象类型,使用过期头,减少对象请求。常见的HTTP对应属性为:public no-cahe max-age等等

  22 缓存Ajax调用

  正确修改Http头Last-Modified Cache-Control Expires等属性。

  23 利用页面缓存

  缓存响应之前的冬天请求,降低web服务器的负载。

  24 利用应用缓存

  比如针对某些特殊的用户,缓存其请求数据。

  25 利用对象缓存

  适用于反复查询使用的数据对象。比如一个购物网站,缓存器热销产品数据。

  26 把对象缓存放在自己的层上

  使用单独的缓层,易于扩展和维护。

如果需要的话,还可以通过在外网、反向代理、后端应用和数据库等边界位置添加额外的硬件防火墙等网络隔离设备来实现更高的安全性保证。

6、故障转移缓存(Failover Caching)

巧妙地使用缓存和懒加载

无需强调,如果你将经常访问的一点数据缓存到内存中,那么这会减少数据库和web服务的调用。正如之前所说,这对于IO受限的应用特别有帮助,当网站处于低负载时可能会造成不幸。

提高站点响应的另一种方式是使用懒加载。懒加载意味着应用里不会有确定的数据片,但是它知道数据在哪里。比如,如果web页面上有一个下拉列表,这意味着要显示一个产品列表,一旦页面加载完毕,不必从数据库中加载所有的产品。你可以在页面中添加一个jQuery函数,该函数可以在第一次下拉时填充下拉列表。你也可以在代码中的许多地方使用相同的技术,比如当使用Linq查询和CLR集合时。

3. 使用多层次的缓存

从错误中吸取教训

  27 积极的学习

  一个公司有学习的氛围,才会衍生出更好的产品。学习的内容一方面包括客户的业务知识,一方面来自技术和运维领域。

  28 不要依靠QA发现失误

  雇佣测试或者质量保证人员,最大的目的是为了检测产品的正确性。它能减少成本,提高开发人员的开发速度,因为开发人员不需要时刻关注代码的正确性,可以交给QA来测试。

  但是QA只负责发现问题,如何避免为题还是得依靠开发人员。

  29 没有回退的设计是失败的设计

  这里的回退,指的是产品发布的回退。如果碰上某些版本的BUG,可能需要交付之前可运行的版本,此时没有回退,就无法交付产品了。

  这里推荐学习持续集成的相关内容。

  30 讨论失败并从中吸取教训

  不应该在同一个问题上失败两次,每次失败多进行总结是不可缺少的。

负载均衡:通常使用轮转(Round Robin)或最少连接数优先等策略完成基于客户请求的负载均衡;也可以使用 SSI 等技术将一个客户请求拆分成若干并行计算部分分别提交到多个应用服务器。

7、重试逻辑(Retry Logic)

不要在MVC视图中放C#代码

ASP.NET MVC视图会在运行时编译而不是在编译时,因此,如果在视图中包含了太多的C#代码,那么你的代码不会编译后放到dll文件中。这样做不仅有害于软件的可测试性,还会使web应用更慢,因为每个页面都有花更长的时间获得显示(因为它们必须被编译)。将代码添加到视图中的其他缺陷在于它们不能异步运行,这样,如果你决定基于TAP来构建应用时,就不能充分利用视图中的异步方法和action了。

比如,如果你的代码中有这么一个方法:

public async Task<string> GetName{    var result = …    return await result;}

该方法可以在一个异步的ASP.NET MVC action的上下文中异步运行,比如:

public Task<ActionResult> Index( CancellationToken ctx ){    var name = await GetName;}

但是如果在一个视图中调用这方法,因为该视图不是异步的,所以必须以一种线程阻塞(thread-blocking)的方式运行,如:

var name = GetName.Result;

.Result会阻塞运行的线程,直到GetName()处理完成了请求,这样该应用的执行会停止一会儿,然而当使用await关键字调用该代码时,该线程不会被阻塞。

在多个层上尽可能地使用缓存,如数据库前的对象缓存(例如:memcached),或是页面内容缓存(例如:squid),边缘缓存(例如:Akamai)。

数据库原则

  关系型数据库的ACID属性:

  原子性:一个事务要么全执行,要么都不执行,

  一致性:事务开始和结束时,所有数据状态要一致,

  隔离性:事务的表现,是事务对数据库唯一的操作,

  持久性:事务完成,操作不能更改。

  31 注意代价高的关系

  应该在设计阶段完善的设计表的结构,等开发开始时,在增加某些列,可能会花费很高的代价。

  32 使用正确的数据库锁

  数据库有很多锁的概念,比如隐式锁、显式锁、行锁、页锁、范围锁、表锁、数据库锁等等。

  不合理的使用锁,会影响网站的吞吐量。

  33 不要使用多阶段提交

  比如两阶段提交:先表决,在提交。这回降低扩展性,因为在其提交事务完成前,是不能作其他操作的。

  34 不要使用select for update

  因为FOR UPDATE从句会导致锁定行,降低事务处理的速度。

  35 不要选择所有的数据

  比如select * from xxx;

  这种做法第一是不开与数据的扩展,比如本来有四列数据,业务处理代码直接写死。当增加了一列数据时,就会导致出错;另外就是会查询出不必要的数据。

  或者inset into xxx values(xxxx);

  这是当列信息不匹配时,也会出错。

分布式的 cache 加速:可以将反向代理分组部署在距离热点地区地理位置较近的网络边界上。通过在位于客户较近的位置提供缓冲服务来加速网络应用。这实际上就构成了 CDN 网络。

8、限流器和负载开关(Rate Limiters and Load Shedders)

适当时使用Fire & Forget

注:Fire & Forget,字面意思是发射,然后忘记,不去理会了。网络释义为射后不理。
如果两个或多个操作没有生成单个事务,那么你很可能不必按顺序运行它们。比如,如果一个用户在你的站点注册时创建了一个账户,一旦他们注册了,你就把他们的详细信息保存到数据库,然后给他们发送一封邮件,你不必等待邮件发送出去才结束这个操作。

在这种情况下,最好的方法很可能就是开启一个新的线程,让它给用户发送邮件,然后返回到主线程。这就叫做Fire& Forget,它可以提高应用的响应能力。

4. 监控应用程序性能

容错设计与故障控制

  36 采用隔离故障的”泳道“

  服务与数据的划分有很多种,比如容器,集群,池,分片,泳道。泳道意味着每个业务有自己的领域,不能跨泳道调用。

  37 不要信任单点故障

  有很多系统设计成单点模式,当整个系统只是用该模块时,当出现单点故障,整个系统也就崩溃了。

  38 避免系统串联

  比如一个系统有很多的组件组成,每个组件99.9%的安全性,当串联3个组件时,整个系统的可用性就变成了99.7%。

  39 确保能够启用/禁用功能

  对于某些共享库,第三方服务,应该提供开启或者关闭的功能。

静态文件伺服:当收到静态文件请求时,直接返回该文件而无需将该请求提交至后端应用服务器。

9、快速且单独失效(Fail Fast and Independently)

为x64 CPU创建

32-bit的应用局限于较低的内存量和可以访问更少的CPU功能/指令。要克服这些限制,如果你的服务器是64-bit的,那么要确保你的应用运行在64-bit模式下(通过确保在IIS的32-bit模式下运行网站的选项是不是开启)。然后为x64 CPU编译并生成代码而不是Any CPU。

x64有用的一个例子是提高数据驱动应用的响应能力和性能,有一个好的缓存机制是必须的。In-proc是消耗内存的,因为一切都存储在网站的应用程序池的内存边界。对于x86进程来说,可以分配的内存量限制到4GB,这样,如果加载到缓存中,这个限制很快就被打破。如果相同的站点是为x64 CPU显式生成的,那么内存限制就不需考虑了,这样更多的条目可以加到缓存中,然后和数据库的通讯就少了,这会带来更好的性能。

首先要站在客户的角度去分析你的程序性能。从外部网络进行监控测试,可以模拟真实的用户体验。同时,还可以根据查询和事务操作上执行次数和耗时数据,来监控程序的内部工作情况。

避免或分发状态

  40 努力实现无状态

  实现状态会限制扩展性,增大成本

  41 尽可能在浏览器端维护会话

  一方面降低服务器压力,另一方面任何的请求可以发送给任何的服务器。

  42 利用分布式缓存存放状态

  使用独立的缓存层,利于扩展。有很多分布式的缓存方案,比如memcached。

动态响应缓存:对一段时间内不会发生改变的动态生成响应进行缓存,避免后端应用服务器频繁执行重复查询和计算。

10、舱壁模式(Bulkheads)

使用服务器上的监视和诊断工具

可能存在你肉眼看不到的更多的性能问题,因为它们不会出现在错误日志中。当应用程序已经部署到基本没有机会调试的服务器上时,识别性能问题是更吓人的事情。

要找出缓慢的处理,线程阻塞,悬挂,错误等等,强烈建议在服务器上安装一个监视和诊断工具,让它们持续地跟踪和监视你的应用程序。我个人使用的是NewRelic检查我的在线网站的健康。获取详细信息并创建免费账号看这里哦!

5. 复制数据库

异步通信和消息总线

  43 尽可能使用异步通信

  异步通信,可以确保每个服务和层之间的独立性,这样易于早呢更加系统的扩展性和减小耦合度。

  44 确保消息总线能够扩展

  尽量采用Y轴或者Z轴扩展,即按业务需求和功能扩展。因为单纯的复制或者克隆,反而会增加各个消息订阅者的监听数目。按照业务隔离,可以分离业务压力。

  45 避免让消息总线过度拥挤

  衡量价值与消息的成本。

图片 8

数据压缩传输:为返回的数据启用 GZIP/ZLIB 压缩算法以节约带宽。

11、断路器(Circuit Breakers)

分析运行中的应用

一旦完成了网站开发,部署到IIS,然后附加一个分析器(如Visual Studio Profiler),然后抓取应用的多个部分的快照。比如抓取购买或者用户注册等操作的快照,然后检查病查看是否存在任何造成缓慢或阻塞的代码。在早期阶段找到那些热点可能会节省你大量的时间,荣誉和金钱。

翻译自:
感谢原作者 ASPGUY

扩展:asp.net web应用如何测试性能及负载测试

复制数据库可以帮助还原数据,同时把读取的负载分配到多个实例。

其他原则

  46 慎用第三方解决方案扩展

  企业如果出现问题,那么寻找第三方能够解决燃眉之急。但是却不是长久之计,因为解决方案的提供商有很多客户,你的危机并不是他们的危机,所以不可能在关键时刻,尽职尽责。因此企业还是应该有一定的掌控力(这个词真是高大上!)。

  47 清除、归档和成本合理的存储

  有一些不必要的数据,就应该定期的删除。一些略有价值的数据进行定期的归档直接删除。一些很有价值的数据,应该进行备份以及快速访问。

  48 删除事务处理中的商业智能

  应该把产品系统与业务系统分离,提高产品的扩展性。

  避免业务扩展时,受到系统架构的限制。

  49 设计能够监控的应用

  应该设计全局的监控策略,保证回答

  ”发生了 问题了吗?“

  ”哪里发生了问题?“

  ”发生了什么问题?“

  ”会发生问题吗?“

  ”能自动修复吗?“

图片 9

  50 要能胜任

  应该在每个设计中涉及到最优秀的架构,不能完全依赖第三方的解决方案。

  一个简单优秀的架构,都是小而精的,如果单纯的依靠开源解决架构,虽然解决了问题,却会导致应用的臃肿。

数据加密保护(SSL Offloading):为与客户端的通信启用 SSL/TLS 加密保护。

12、故障测试(Testing for Failures)

6. 使用切片(Sharding)技术

参考

  【1】《高扩展性网站的50条原则》

容错:跟踪后端应用服务器的健康状况,避免将请求调度到发生故障的服务器。

13、总结

根据不同服务或(和)用户使用的量级来分割应用和数据库。虽然它会给程序带来一些轻量的复杂度,但在规模上这样做更易于扩展。

用户鉴权:完成用户登陆和会话建立等工作。

14、要点

7. 尽可能少的使用关系型数据库RDBMS特性

URL别名:对外建立统一的url别名信息,屏蔽真实位置。

微服务架构通过定义明确的服务边界,能有效地隔离故障。 和其他分布式系统一样,微服务在网络、硬件和应用层上都会存在更多的问题。由于服务之间是互相依赖,因此任何组件都可能出错导致用户不能访问。为尽可能减少部分中断带来的影响,我们需要构建容错能力强的服务,以从容应对发生的某些中断。

尽可能使用OLTP(on-line transaction processing,联机事务处理 )数据库作为存储设备。因为要确保ACID属性,关系型数据库在扩展型方面会有很多挑战。你的交易越依赖关系型数据库系统(RDBMS)提供的功能,那么系统在扩展时你投入的负载就越大。建议从数据库中将主要的业务逻辑(例如存储过程)都移到应用程序或服务内。当系统需要做大规模扩展时,应该通过应用或服务来扩展, 而不是通过SQL。

应用混搭:通过SSI和URL映射技术将不同的web应用混搭在一起。

本文介绍了构建和运维高可用的微服务架构系统中最常用的技术和架构模式。如果读者不熟悉上述的模式,那并没什么大碍。构建可靠的系统不是一踞而就的。

图片 10

协议转换:为使用 SCGI 和 FastCGI 等协议的后端应用提供协议转换服务。

微服务架构将应用逻辑拆分成服务,服务之间通过网络交互。由于是通过网络调用,而不是在进程中调用,因此这给需要在多个物理和逻辑组件间进行协作的系统带来了潜在的问题和复杂性。分布式系统变得越来越复杂,也导致网络特定故障发生的可能性增大。

8. 在服务器上小批量地部署新代码

目前比较有名的反向代理服务包括:Apache

相比传统应用庞大的结构,微服务架构最大的一个优点是团队能独立地设计、开发和部署各自的服务。团队能掌控各自服务的整个生命周期。这也意味者团队无法控制服务的依赖关系,因为这些依赖的服务可能是由其他团队管理。在微服务架构体系下,我们要牢记提供的服务由于是其他人控制,因此可能会由于发布、配置、和其他变更等原因,从而导致服务暂时不可用,而且组件之间互相独立。

尽可能小批量地在服务器上部署新代码,而不要让整个站点关闭。这要求所有代码都要向后兼容,因为在部署时你会有两个版本的代码同时运行。这种方法可以帮助我们方便地找到应用质量或者L&P测试(负载性能测试)所遗漏的问题,同时最小化对客户的影响。

httpd mod_proxy / IIS ARR / Squid / Apache Traffic Server / Nginx /

微服务架构最大的优点之一就是当组件出现故障时,能隔离这些故障并且能做到优雅地服务降级。比如,在图片分享应用中,当出现故障时,用户可能无法上传图片,但他们依然能浏览、编辑和分享已上传的图片。

9. 在部署前执行负载与性能测试

Cherokee / Lighttpd / HAProxy 以及 Varnish 等等。

图片 11微服务故障独立

一定要在产品部署前,执行负载与性能测试。虽然这不会发现所有问题(这也是为什么我们需要回滚 Rollback的能力),但它很值得做。

应用服务

在大多数情况下,是很难实现上图这种优雅地服务降级的,因为在分布式环境下,应用都是互相依赖的,开发者需要实现若干错误处理的逻辑(该部分在本文稍后部分讨论)去应对短暂的故障和中断。

10. 不能回滚注定失败

应用服务层位于数据库等后端通用服务层与反向代理层之间,向上接收由反向代理服务转发而来的客户端访问请求,向下访问由数据库层提供的结构化存储与数据查询服务。

图片 12服务互相依赖,如果无故障转移的逻辑,则会同时失效

本文由彩票365下载发布于彩票365官网手机购彩技术,转载请注明出处:架构干货,给中高端开垦者

关键词: 彩票365下载

上一篇:谁更值得购买,MWC2019重磅新机全汇总

下一篇:没有了