RabbitMQ的学习和使用——相关知识
1.怎么自动删除一直未消费的消息?
TTL:设置一个队列的消息的time to live或者设置消息的time to live
生产者在生产消息的时候:
AMQP.BasicProperties basicProperties=new AMQP.BasicProperties().builder()
.deliveryMode(2)//是否持久化 1不持久化 2持久化
.contentEncoding("UTF-8")
.expiration("10000")//过期时间 10秒
.headers(map)//自定义属性
.build();
生产者在声明队列的时候
Map<String,Object> arguments=new HashMap<>();
arguments.put("x-message-ttl",6000);
channel.queueDeclare(queueName,false,false,false,arguments);
2.死信队列
没有队列能够达到的消息组成的队列
满足死信队列的条件:
1.消息队列
2.消息被reject(消息被拒绝) nack(消息没有应答) requeue为false(消息被拒绝入队)
3.队列达到最大长度,先入队列的会被删除
消息达到死信可以通过死信交换机路由到死信队列进行查看,即自己声明一个死信交换机,通过#号的绑定到死信队列。
3.队列的消息优先级
消费者定义队列的时候设置队列优先级
//声明队列
Map<String,Object> arguments=new HashMap<>();
arguments.put("x-max-priority",10);
channel.queueDeclare(queueName,false,false,false,arguments);
生产者生产消息定义消息的优先级
AMQP.BasicProperties basicProperties=new AMQP.BasicProperties().builder()
.deliveryMode(2)//是否持久化 1不持久化 2持久化
.contentEncoding("UTF-8")
.expiration("10000")//过期时间 10秒
.headers(map)//自定义属性
.priority(5)//定义优先级
.build();
4.延迟队列
可以通过死信队列+消息的TTL来做延迟队列
5.消息的保证发送和消费成功
1.消费者回调
消费者对消息进行手工ACK确认,将消息落库和提供回调的API,来保证消息的消费
2.补偿机制
对于生产者来说,可以将消息的发送记录下来落库,然后根据状态来重发,设置重发次数,超过重发次数则进行手工补偿。
对于消费者来说,可以将收到的消息进行落库确认,根据状态设置应答。
3.消息冪等性
消费者在进行消费消息时,如果生产者发送了重复的消息,可以通过重账控制表进行去重到业务消费。
4.消费顺序性
一个队列一个消费者的时候才能保证顺序