作者:手机用户2602923361 | 来源:互联网 | 2023-07-09 14:58
消息中间件 谈谈开发中应用消息中间件的场景?或适用的场景? 适合场景:不需要实时性的
可以达到什么效果:
1,解耦 2,异步化 3,限流消峰 案例
1,商品管理(静态页面+搜索页面)
以上是同步的方式
消耗的时间: T1+T2+T3
处于耦合状态:某个系统有问题,会有影响,或者新增一个系统,也会影响到我们的代码
并不符合我们说的设计原则:OCP原则,开闭原则
解耦: 时间:T1+t1
处于解耦的状态
2,基础服务,都已经采用异步的方式来为其他系统提供服务(短信,邮件,积分等等)
3,限流削峰
就是前后两个交互的系统处理的速度不匹配,为了保护处理慢的系统,从而引入消息中间件,来实现削峰限流处理 方案一:异步写的方案,保护数据库,缓解瞬间写的压力 方案二:再比如秒杀系统,会产生很多的订单信息,此时也可以通过MQ来保护订单系统。
限流好处:节省服务器成本
如何保证消息的可达或不丢失? 1,背景:
网络是不可靠的
像我们上面所描述的各种场景,一旦消息出现丢失,将会造成各种问题。比如邮件没有发送,短信没有收到等等。
2,解决方案:
确认机制+补偿发送
这个问题需要分为多个节点来考虑
这里面的每个环节出问题都有可能造成消息的不可达,所以,我们需要保证针对每个环节设计解决方案
1,消息要发送到MQ服务器
解决的方式有两种:
方式一:事物的方式(了解即可,性能不佳)
方式二:异步confirm模式,推荐,客户端通过设置cnfirm监听器,获取MQ服务器的异步响应。
如果消息成功传递到MQ服务器,则服务器会传递回ACK=true,否则ACK=false
2, return机制 ,保证消息到了MQ服务器之后,是否能正确路由到交换机或者队列,这个是在正常情况下是不会发生的,所以一般在开发中我们会忽略掉这个设置
3,消息队列做持久化
消息成功传递到MQ服务器之后,还需要对消息队列做持久化,否则一旦消息服务器宕机,那么未处理的消息将会丢失
4,消费端的手工确认模式开启 ,只有消费端手工确认之后,才表示这个消息已经被正确处理了
这个环节是确保消息真的被消费端正确处理了,如果没有被正确处理,那么消息还是需要重新处理的。
1,有可能MQ服务器没有收到消费端发送的确认消息,会重复处理,所以要保证接口的幂等性,
2,为了避免重复处理不成功,造成阻塞,所以,我们引入有固定次数的重试机制 (失败的情况 )
当然为了避免消息重复处理依然失败的情况,我们一般设置为重复处理三次,如果三次还是有问题,
则应该讲错误信息记录到日志中,然后人工介入处理。避免堵塞到后面的消息处理。
什么是延迟队列? 作用:
需要延迟处理的消息,我们将使用延迟队列来达到这个效果
背景:
比如订单超时未支付,我们需要取消订单,解锁库存。
实现方案:
方案一:采用定时任务
通过定时任务扫描订单表,判断订单的下单时间跟当前时间的时间差,如果超过指定时间,比如30分钟,则取消订单。但是这个方案存在问题,就是频繁扫描订单表,会给数据库带来较大的压力
一秒一次 30*60=1800次
方案二:采用消息队列提供的延迟队列,跟数据库的交互只需要一次 消息超过了有效期,没有人处理,就称为死信