
微服务分布式系统
文章平均质量分 64
与微服务分布式系统相关的技术分享
呱呱
这个作者很懒,什么都没留下…
展开
-
Redis:Redisson分布式锁的锁续期原理
之前说的如果使用setnx做分布式锁的时候,会有锁续期的问题,也就是说如果锁过期时间10s,而业务处理花了30s,而redisson就可以处理恰好处理这类锁续期的问题;而这类自动续期的机制就是所谓的看门狗机制总的来说就是默认锁过期时间是30s,而自动续期机制在源码当中就是开启了定时任务,定时间隔是看门狗时间的三分之一,也就是10s,所以就是在业务没有处理完的情况下锁默认每隔10s续期到30s;下面主要看看源码当中是怎么定义的;看门狗源码分析源码:RedissonLock.classprivate原创 2022-03-01 22:43:55 · 6610 阅读 · 0 评论 -
分布式缓存一致性:双写模式和失效模式
1、双写模式双写模式:就是写完数据库之后再去写缓存,保持缓存一致性;脏数据问题:如上图,线程A和B都去写数据库,正常情况下应该是,A先写数据库先写缓存,B后写数据库后写缓存;但是由于卡顿等原因,导致写缓存2在最前,写缓存1在后面就出现了不一致;出现脏数据,但是这是暂时性的脏数据问题,在数据稳定,缓存过期以后,又能得到最新的正确数据;2、失效模式失效模式:简言之就是写完数据库,不用写缓存,而是删缓存,等有请求进来读数据的时候,缓存中没有,就会查数据库,然后主动放到缓存里面。也叫触发主动更新;3、原创 2022-02-28 23:28:38 · 2686 阅读 · 1 评论 -
Redis:缓存失效问题(缓存穿透、雪崩、击穿)
缓存穿透查询一个永不存在的数据指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义;风险:利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃解决:null结果缓存,并加入短暂过期时间;布隆过滤器、mvc拦截器布隆过滤器对于有些场景,当访问一个本就不存的数据时,这时我们不需要去走redis和数据库查询,应该直接返回一个错误的提示,这样可以防止恶意访原创 2022-02-28 23:11:13 · 408 阅读 · 0 评论 -
认证服务:验证码防刷校验与密码加密
验证码防刷校验为了避免验证码重复发送,可以引入redis将验证码缓存起来;发送验证码,先去缓存中查,如果有,判断时间,确保60s之后才能再次发送验证码;如果没有,就可以发送;验证码的再次校验,使用redis将验证码缓存起来,并设置过期时间,如果验证码匹配成功,就立即删除缓存;key->sms:code:15825826017value->45678_当前时间(System.currentTimeMillis())设置认证服务的常量public class AuthServ原创 2022-02-28 23:02:51 · 705 阅读 · 0 评论 -
RabbitMQ:保证消息的可靠性(消息丢失、重复、积压、顺序)
使用RabbitMQ最终一致性方案,一定要保证可靠消息以下四种情况是消息队列在分布式情况下保证消息可靠的常见问题;消息丢失(最怕)1、消息发送出去,由于网络问题没有抵达服务器解决:(1)做好容错方法(try-catch),发送消息可能会网络失败,失败后要有重试机制,可记录到数据库,采取定期扫描重发的方式;(2)做好日志记录,每个消息状态是否都被服务器收到都应该记录;(3)做好定期重发,如果消息没有发送成功,定期去数据库扫描未完成的消息进行重发;2、消息抵达Broker,Broker要将消息写原创 2022-02-28 22:51:04 · 2958 阅读 · 0 评论 -
谷粒商城:订单锁库存保证事务最终一致性
RabbitMQ延时队列(实现定时任务)场景:比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品常用解决方案:spring的schedule定时任务轮询数据库缺点:消耗系统内存,增加数据库压力,存在较大的时间误差解决:RabbitMQ的消息TTL的死信Exchange结合消息的TTL就是消息的存活时间RabbitMQ可以对队列和消息分别设置TTL:推荐给队列设置过期时间对队列设置就是队列没有消费者连着的保留时间,也可以对每个单独的消息做单独的设置,超过了这个时间,我们认为这个.原创 2022-02-28 22:09:57 · 3310 阅读 · 0 评论 -
分布式事务:基本原理CAP&BASE
分布式事务CAP定理与BASE理论CAP定理分布式存储系统的CAP原理(分布式系统的三个指标):Consistency(强一致性):在分布式系统中的所有数据备份,在同一时刻是否同样的值。对于数据分布在不同节点上的数据来说,如果在某个节点更新了数据,那么在其他节点如果都能读取到这个最新的数据,那么就称为强一致,如果有某个节点没有读取到,那就是分布式不一致。Availability(可用性):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(要求数据需要备份)Par原创 2022-02-27 18:27:05 · 146 阅读 · 0 评论 -
Feign:远程和异步调用丢失头信息的问题
示例以谷粒商城订单系统远程调用购物车系统为例!!!Feign远程调用丢失header请求头的问题Feign在远程调用之前要构造请求 调用很多拦截器,订单服务的ToTrade请求带了cookie等头信息,但是要进行远程调用时,Feign创建了一个新的请求,这个新请求里面没有任何头信息,所以会丢失请求头;导致购物车服务认为这个请求没登录;解决:加上feign远程调用的请求拦截器RequestInterceptor,会首先调用请求拦截器的apply()方法,在apply()方法里面通过Reques原创 2022-02-27 18:02:38 · 1185 阅读 · 0 评论 -
谷粒商城:秒杀系统设计与编写
1. 秒杀系统设计秒杀(高并发)系统关注的问题1、服务单独职责+独立部署秒杀系统为单独的服务,即使自己扛不住压力挂掉,也不要影响其他服务2、秒杀链接加密防止恶意攻击,模拟秒杀请求,1000次/s的攻击;防止链接暴露,自己工作人员,提前秒杀商品;我们使用了带uuid随机码的机制;3、库存预热+快速扣减秒杀读多写少,无需每次实时校验库存,我们库存预热,放到redis中,信号量控制进来秒杀的请求;为了保证redis可以保证千万并发,可以给redis做集群,做成分片高可用;我们是用定时任务提取三天原创 2022-02-27 17:01:59 · 1239 阅读 · 0 评论 -
谷粒商城:秒杀商品定时上架
1.定时任务1、spring中6位组成,不允许第七位的年,即秒、分、时、日、月、周2、在周几的位置,1-7代表周一到周日,MON-SUN3、定时任务不应该是阻塞的,默认是阻塞的。(1)可以让业务以异步的方式运行,自己提交给线程池(2)支持定时任务线程池,设置TaskShedulingProperties spring.task.scheduling.pool.size=5 #默认size是1,也就是阻塞(3)让定时任务异步执行,自动配置类 TaskExecutionAutoConfigu原创 2022-02-27 16:56:26 · 1334 阅读 · 0 评论