一止长渊
接口幂等性

1.定义:

用户对于统一操作发起的一次请求或者多次请求的结果是一致的;例如支付场景用户购买商品扣款,网络延迟用户再次点击也不会重复扣款。
就好比 1 的幂,无论是 1 的 100 次幂,还是 1 的 1000 次幂都是 1

Feign远程调用丢失请求头问题

Feign 远程调用丢失请求头问题

在订单模块 Feign 调用购物车模块,查询用户的购物车详情时,购物车拦截器是通过拦截 SpringSession 来获取用户的信息的,通过订单模块和购物车模块直接从浏览器访问页面是可以直接从 SpringSession 中获取用户信息的,但是在 Fegin 相互调用经过购物车的拦截器时无法获取到用户的信息,这就是 Feign 远程调用丢失请求头的问题。
截屏2021-06-15 16.09.27.png

Message Queue消息队列——RabbitMQ

和队列 Queue 类似,不过消息队列是在分布式情况下,每个服务从一个消息队列中取出东西。消息保存到消息队列中,别的服务从消息中间件中取消息。

一、应用场景

异步、削峰、解耦

1.异步

截屏2021-05-18 19.45.28.png
例如用户注册为例
图 1:需要将用户信息写入到数据库中,然后发送注册邮件和注册短信,如果按照图 1 的方式顺序进行就会响应达到 150ms;
图 2:如果使用 CompletableFuture 进行异步编排,将发送注册邮件和发送注册信息进行并行处理,等待两者都完成就进行返回,则响应可以缩减到 100ms
图 3:其实我们并不关心发送注册邮件和短信是否成功,即使有时候是不成功的状态也是可以理解的,只要用户重复几次就行。只要将注册信息写入数据库,然后将消息写入到消息队列中,就立即返回,延迟就只需要 55ms,发送注册邮件和发送注册短信会由其他微服务从消息队列中取出消息进行处理,这样就可以将延迟进行进一步缩短。

2.解耦

截屏2021-05-18 19.58.18.png
当服务之间进行相互调用时,例如订单服务下单时需要调用库存服务进行出库操作,但是库存系统经常进行升级,导致接口参数经常发生变化,如果是使用 Feign 进行调用,当库存系统进行升级了,订单系统中的 Feign 接口就会发生变动。如果使用消息队列就可以进行解耦,当订单系统下订单后向消息队列中写入消息:某某下了一个订单,购置商品 xxx 几件,然后库存系统从消息队列中取出消息即可,这样就进行了解耦。

JUC异步编排——CompletableFuture

1、业务背景

截屏2021-05-04 16.36.46.png
业务场景:查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间。

redis缓存数据一致性问题

redis 缓存数据一致性问题就是指 redis 中缓存的数据与数据库中对应的数据不一致
通常解决这种 redis 不一致问题有两种解决方式:

  • 双写模式
  • 失效模式