和队列 Queue 类似,不过消息队列是在分布式情况下,每个服务从一个消息队列中取出东西。消息保存到消息队列中,别的服务从消息中间件中取消息。
一、应用场景
异步、削峰、解耦
1.异步
例如用户注册为例
图 1:需要将用户信息写入到数据库中,然后发送注册邮件和注册短信,如果按照图 1 的方式顺序进行就会响应达到 150ms;
图 2:如果使用 CompletableFuture 进行异步编排,将发送注册邮件和发送注册信息进行并行处理,等待两者都完成就进行返回,则响应可以缩减到 100ms
图 3:其实我们并不关心发送注册邮件和短信是否成功,即使有时候是不成功的状态也是可以理解的,只要用户重复几次就行。只要将注册信息写入数据库,然后将消息写入到消息队列中,就立即返回,延迟就只需要 55ms,发送注册邮件和发送注册短信会由其他微服务从消息队列中取出消息进行处理,这样就可以将延迟进行进一步缩短。
2.解耦
当服务之间进行相互调用时,例如订单服务下单时需要调用库存服务进行出库操作,但是库存系统经常进行升级,导致接口参数经常发生变化,如果是使用 Feign 进行调用,当库存系统进行升级了,订单系统中的 Feign 接口就会发生变动。如果使用消息队列就可以进行解耦,当订单系统下订单后向消息队列中写入消息:某某下了一个订单,购置商品 xxx 几件,然后库存系统从消息队列中取出消息即可,这样就进行了解耦。
redis 缓存数据一致性问题就是指 redis 中缓存的数据与数据库中对应的数据不一致
通常解决这种 redis 不一致问题有两种解决方式:
- 双写模式
- 失效模式