RabbitMQ延时队列和死信队列实现

一、理论基础

1.1、RabbitMQ有哪些重要的组件(6个)

ConnectionFactory连接管理器:用户与MQ建立的连接管理器;

Channel信道:消息推送使用的通道;

Exchange交换机:用于接收、分配消息;

Queue队列用于存储生产者的消息

RoutingKey路由键:用于把生产者的数据分配(路由)到交换机上;

BingDingKey绑定建:用于把交换器的消息绑定到队列中。

1.2、Rabbitmq 的消息是怎么发送的

客户端通过TCP连接到MQ服务器,连接成功后MQ与客户端建立了一条amqp信道Channer,信道是创建的真实的TCP上的虚拟连接,amqp命令都是通过信道发送出去的

1.3、MQ怎么避免消息丢失

消息持久化、ACK确认机制、集群、消息补偿机制

1.4、三种广播模式

fanout:凡事绑定到此交换机和队列都可以接受消息;

direct:通过路由键和交换机决定唯一的队列可以接受消息;

topic:所有符合路由键所绑定的队列都可以接受消息。

1.5、延迟队列

什么是延迟队列:用来存放需要在指定时间被处理的元素的队列,延迟队列中的元素都是带时间属性(TTL)的

什么场景使用延迟队列:

  • 订单在十分钟未支付则自动取消;
  • 新创建的店铺如果十天内未上传过商品,则自动发送消息提醒;
  • 账单在一周内未支付,则自动支付;
  • 用户发起退款,如果三天内没有处理则通知相关人员;
  • 预定会议后,需要在预定时间前10分钟,通知参会人员。

1.6、什么是TTL

TTL是MQ中一个消息或者队列的属性,表明一条消息或者队列中所有消息或者队列的最大存活时间,单位是毫秒。如果一条消息设置了TTL属性,或者进入了设置TTL的队列,如果这条消息在TTL内的时间未被消费则该条消息则变成死信,如果配置了消息的TTL和队列的TTL则较小的那个值会被使用。

如何设置TTL(2种方式)

(1)一种是创建队列的时候设置队列的“x-message-ttl”属性,如:

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 6000);
channel.queueDeclare(queueName, durable, exclusive, autoDelete, args);

(2)另一种是针对每条消息设置TTL:

AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.expiration("6000");
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(exchangeName, routingKey, mandatory, properties, "msg body".getBytes());

两种方式的区别:

如果设置了队列的TTL,如果消息过期则被队列丢弃;而第二种即使消息过期也不会马上被丢弃, 因为消息是否过期是在即将投递到消费者之前被判定的。此外,如果不设置TTL则表示消息永远不会过期,消息过期则变成死信。

 

二、实战

.....待更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章