rabbitMQ启动
rabbitmq-server -detached #开启
rabbitmqctl stop
交换机类型
直接交换机
directExchanger 由routingKey指定将消息发送到哪个队列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GiIGt1jn-1675263962989)(null)]
扇出交换机
fanoutExchange 广播,不需要指定routingKey,交换机将消息发送给所有与之绑定的队列
主题交换机
topicExchange 主题交换机,对路由键进行模式匹配,交换机只将消息发送给匹配的队列
头交换机
headerExchange 头交换机,用的不多
延迟队列
基于死信的延迟队列
是死信队列的一种,是指发送ttl消息时,只有在消息过期时才处理,当达到ttl时间后,将消息放入死信队列进行处理,这就是延迟队列。
不使用插件的延迟队列有一种问题,因为是队列,先进先出,只有在队头的消息mq才会检查这个消息是否过期,选择是否放入死信队列,如果队头消息ttl特别长,队中消息ttl较短时,也无法先处理队中元素。
基于插件的延迟队列
在rabbitmq下plugins包中下载插件后,交换机多出来一种类型(“x-delayed-message”),跟基于死信不同的是,基于插件的延迟队列在交换机中完成延迟排序,在交换机中,将延迟时间到期的消息发送到队列中,消费者可直接进行消费。基于死信的是所以消息在队列中才进行延迟判断,这样会有缺陷。
发布确认高级
是指生产者发送一条消息后,如果交换机或者队列发生错误时,这条消息会被丢弃,添加配置文件后,发送消息交换机都会确认这条消息是否被接收,通过confirmCallback来确认消息是否被交换机接收,当队列或路由key错误时,不会提示,需要通过returnsCallback来获取未发送消息的信息
#当属性为correlated时发送消息时会触发消息回调函数 ConfirmCallback
#CORRELATED值是发布消息成功到交换器后会触发回调方法
spring.rabbitmq.publisher-confirm-type=correlated
#当属性为true时,当消息发送失败,会触发returnsCallback回调函数,参数包括消息的各种信息
spring.rabbitmq.publisher-returns=true
消息重复消费
1.唯一id + 指纹码机制
就是拼接一个唯一id存在数据库中,查询判断是否重复,劣势是高并发下频繁访问数据库,会有写入性能瓶颈,可以分库分表
2.redis原子性
利用redis的setnx,天然具有幂等性,不会重复消费