消息的可靠性投递
RabbitMQ为我们提供了两种方式用来控制消息的的投递可靠性模式。
confirm确认模式;
return退回模式
Rabbitmq 整个消息投递的路径为:producer--->rabbitmq broker--->exchange--->queue--->consumer 消息从 producer 到 exchange 则会返回一个 confirmCallback 。
消息从 exchange-->queue 投递失败则会返回一个 returnCallback 。
TTL:Time To Live(存活时间、过期时间);
1、当消息到达存活时间后,还没有被消费,会被自动清除;
2、RabbitMQ可以对消息设置过期时间,也可以对整个队列设置过期时间。
死信队列,英文缩写:DLX;Dead Letter Exchange(死信交换机),当消息成为Dead Message后,可以被重新发送到另一台交换机,这个交换机就是DLX。
消息成为死信的三个条件:
1、队列消息长度达到限制;
2、消费者拒接消息,并且不把消息重新放入原目标队列;
3、原队列存在消息过期设置,消息到达超时时间未被消费。
1、生产者发送一个消息到交换机,交换机将消息交给绑定了该交换机的队列;
2、当该消息到了设置的过期时间还没有被消费,就会将该消息发送给死信队列;
3、由死信交换机将该消息发送给绑定了该死信交换机的队列,消费者2消费该数据。
思考:订单场景
当提交订单后,如果完成支付,则会被消费者1消费锁库存、加积分;
当订单提交后,如果超过30分钟还没有支付,则这个消息会被消费者2消费,删除该订单。
延迟队列:消息进入队列后不会被立即消费,只有到达指定的时间后,才会被消费;
场景: 1、下单后,30分钟未支付,取消订单,回滚库存;
2、新用户注册成功7天后,发送短信问候。
实现方式:
1、定时器;
2、延迟队列。
在rabbitmq中,并未提供延迟队列的功能,可以使用TTL+死信队列的组合实现延迟队列的效果。
RabbitMQ的应用问题:
1、消息可靠性保障:消息的补偿机制
2、消息幂等性保障:乐观锁解决方案