昨日回顾:
work模式:能解决能者多劳——把ack的自动改为手动,明确一次只拿1条消息 basicQos(1)
如果没有明确一次只拿一条消息,哪么没有消费的消息会堆积在消费端。
发布订阅模式:一条消息北多条消费者消费。使用了交换机,一条消息可以同时被绑定在交换机上的队列接收
发布订阅模式:
一条消息被多个消费者。使用了交换机,一条消息发给交换机后,交换机把消息同时发给所有的队列,此时队列上绑定的消费者就可以拿到消息。
路由模式:
一条消息被多个消费者消费使用了交换机,消息发送到交换机上后,交换机通过routing-key来找到对应的队列(不是所有的多队列)此时对应的队列上监听的消费者就能拿到消息。
通配符模式:
一条消息被多个消费者消费使用了交换机,基于路由模式在创建队列和交换机的映射关系时,在routing-key上使用通配符。
*:当前层次的问题,如果在关系时使用了这样的key:qf.java.*,那么qf.java.orangeh或者qf.java.banana都可以命中,但是qf.java.orange.red就不能命中
#:时无层次级当前层次的问题,如果在关系时使用了这样的key:qf.java.*,那么qf.java.orangeh或者qf.java.banana都可以命中,但是qf.java.orange.red都能命中:
十:使用MQ来改造项目:
比如要做的事情:下订单:要发生的事情有:
1):在订单数据库order里添加一条订单记录——在订单库+x
2)减库存——在库存库-1
3)加积分——在积分库加xxx
电商:用异步的方式,在服务器上逐一的去完成,
十一:消息队列的高级用法
1):消息的持久化:
在发送消息时,可以设置一个bassicProperties对象,在对象中封装一些配置信息。
.deliverModel(2) 2标识持久化消息,服务重启后,消息还在
.expretion(“10000")表示消息在10秒钟没有消费就会过期
2):如何在消费端做限流:
为实现限流在消费端设置一个baisicQos(5) ,限流算法:令牌桶算法,漏桶算法。
3)Comfilm_Listenner消息队列模式
上半场ack与下半场ack的区别:
4):Ack与Nack和Rejest的区别
4.1Ack对于明确要消费的消息。可以通过Ack告知mq,mq就会发送一条消息给消息给消费者。
4.2Nack告知mq这样的消息我不处理,丢弃掉,此消息会变为死信。
channel.basicNack(envelope.getDeliveryTag(),false, false)
第一个参数:envelope.getDeliveryTage表示消息的唯一标识ID,是一个正整数,是mq的设置
第二个参数:是否批量处理,可以提高效率:
第三个参数:是否重回队列的话,那么下一次还会继续消费这条消息,所以一般情况下不会重回队列:
3)Reject
reject与nack的用法相同,但是与nack只有一个区别,nack一次可以拒绝多条消息,但是reject一次只能拒绝一条消息
4)Return_Listenner不可达时因该咋样处理
当发消息时交换机不在,或者队列不在,或者Routing-key错误,那么相应的Renting-Listenner就可以工作了,注意,使用这个功能时,要把basicpublish中使用 mandatory开启
5)死信队列:
如果设置了死信队列,当以一个普通的消息成为死信队列后 于是这样的消息就会被自动publish到死信队列中。
5.1 消息被拒签就不会再回到队列;
5.2消息过期了
5.3超过了队列的长度,消息就会成为死信
通过消息的过期成为死信,死信队列很容易就会做出一个延迟队列的效果。
1.延迟队列:
项目:下单30分钟如果没有付款,该订单就会关闭