雪崩

服务的降级、限流、熔断

荒凉一梦 提交于 2019-11-26 16:38:16
服务学崩效应 服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口, 这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。 服务降级 在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法) 服务熔断 熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用 服务隔离 因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。 解决服务雪崩效应:使用服务隔离机制(线程池方式和信号量),使用线程池方式实現隔离的原理: 相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样的话就可以解决服务雪崩效应。 线程池隔离: 每个服务接口,都有自己独立的线程池,每个线程池互不影响。 信号量隔离: 使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1。 服务限流

关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案

自闭症网瘾萝莉.ら 提交于 2019-11-26 16:20:03
本文转载自公众号:乔二爷,知识星球内成员、Java 极客技术作者团队成员。 这篇文章,是这位同学对自己阿里一面的总结,大家可以参考一下,同时也感谢乔二爷同学的分享。 1 前言 昨天晚上接到阿里的电面电话,过程中就问到了关于缓存相关的问题。 虽然以前接触过,多多少少了解了一些。但是之前自己并没有好好记录这些内容,在真正面试的时候,并没有回答得出来。今天记录一下,长长记性。 在我们的平常的项目中多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。 特别是高 QPS 的系统,每次都去查询数据库,对于你的数据库来说将是灾难。 今天我们不牵涉多级缓存的知识,就把系统使用到的缓存方案,不管是一级还是多级的都统称为缓存,主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。 我们使用缓存时,我们的业务系统大概的调用流程如下图: 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能会出现一些现象。 2 缓存穿透 2.1 什么是缓存穿透 正常情况下,我们去查询数据都是存在。 那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。 这种查询不存在数据的现象我们称为 缓存穿透 。 2.2 穿透带来的问题 试想一下

关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案

梦想的初衷 提交于 2019-11-26 16:19:36
前言 在我们的平常的项目中多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。 特别是高 QPS 的系统,每次都去查询数据库,对于你的数据库来说将是灾难。 今天我们不牵涉多级缓存的知识,就把系统使用到的缓存方案,不管是一级还是多级的都统称为缓存,主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。 我们使用缓存时,我们的业务系统大概的调用流程如下图: 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能会出现一些现象。 缓存穿透 什么是缓存穿透 正常情况下,我们去查询数据都是存在。 那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。 这种查询不存在数据的现象我们称为 缓存穿透 。 穿透带来的问题 试想一下,如果有黑客会对你的系统进行攻击,拿一个不存在的id 去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。 解决办法 缓存空值 之所以会发生穿透,就是因为缓存中没有存储这些空数据的key。从而导致每次查询都到数据库去了。 那么我们就可以为这些key对应的值设置为null 丢到缓存里面去。后面再出现查询这个key 的请求的时候,直接返回null 。 这样,就不用在到数据库中去走一圈了

缓存雪崩 缓存穿透

守給你的承諾、 提交于 2019-11-25 23:59:29
1,什么叫缓存雪崩 由于缓存失效,大量的访问直接去访问数据库,对数据库和CPU造成巨大的压力,严重的会造成数据库的宕机,系统崩溃。 2,如何防止缓存雪崩 1,缓存雪崩造成的直接原因,是由于同一时刻大量的缓存同时失效,所以大量的访问可能都没有从缓存中获得数据,从而访问数据库了。 可以让不同的key,设置不同的缓存时间,让缓存的失效时间分布的均匀点。 缺点,开发的时候比较麻烦,你开发的这个功能,还得问别人的开发功能的缓存的失效时间 2,可以用锁 对于数据库的访问,每次只能1个线程进行访问 缺点:治标不治本,性能差,只是减少了数据库的访问压力 3,消息中间件 用消息中间件的方式,和加锁的方式比较像,消息中间间可以相当于一个缓存队列,每次访问数据库的线程相对于加锁要多一点,性能要好 4,通过一级加二级缓存的方式 一级里面查询不到,到二级里面去查询。 做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充) 3,什么叫缓存穿透 缓存穿透就是,每次访问缓存的时候,没有访问到,然后去访问数据库,数据库也没有,多个类似的请求的时候,就会对数据库造成很大压力。 这种情况,黑客进行攻击的时候会出现 解决办法:如果数据库也没有,返回空,放入到缓存中,下次查询就不会访问数据库了,会减少数据库的压力。 private String

关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案(转)

核能气质少年 提交于 2019-11-25 16:57:29
1.我们使用缓存时的业务流程大概为: 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能出现下面的一些现象。 2.缓存穿透 2.1什么是缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 2.2缓存穿透带来的问题 试想一下,如果有黑客对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到你的数据库去查询,可能会导致你的数据库由于压力过大而宕掉。 2.3解决的办法 2.3.1缓存空值 之所以会发生穿透,就是因为缓存中没有储存这些空数据的key。从而导致每次查询都到数据库去了。 那么我们就可以为这些key对应的值设置为null丢到缓存里面去。后面出现查询这个key的请求的时候直接返回null。 这样就不用再到数据库中去走一圈了,但是别忘了设置过期时间。 缓存空对象会有两个问题: 第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。 第二