RabbitMQ学习笔记-02.消息

持久化消息

指消息想要从Rabbit崩溃中恢复,那么消息必须:

    把投递模式(delivery mod)设置为 2,即持久 发送到持久化的交换器 到达持久化的队列

如何保证消息发送成功

方法1

使用发送方确认机制,只有消息安全到达了队列后,RabbitMQ会向生产者发送一条确认消息,生产者可以根据确认消息进行相关函数的回调

方法2

如果消息没有匹配路由,则可以在发布消息的时候加入mandatory参数,设置为true,则未路由的消息可以返回给生产者,生产者可以通过添加ReturnListener监听器来去获取返回的消息

方法3

注意事项

    如果设置的备份交换器不存在,客户端和RabbitMQ服务端都不会出现异常,此时消息丢失 如果备份交换器没有绑定任何队列,客户端和RabbitMQ服务端都不会出现异常,此时消息丢失 如果备份交换器没有匹配到任何队列,客户端和RabbitMQ服务端都不会出现异常,此时消息丢失 如果备份交换器和 mandatory 参数一起使用,那么mandatory参数无效

如何保证消息接收成功

消费者接收到消息后,返回一个确认消息给MQ,否则不会向该消费者继续发送消息

消息生命周期

生产者

    连接到RabbitMQ 获取信道 声明交换机 创建消息 发布消息 关闭信道 关闭连接

消费者

    连接到RabbitMQ 获得信道 声明交换机 声明队列 把队列和交换机绑定起来 消费消息 关闭信道 关闭连接

消息设置过期时间

方法1

为队列中的所有消息都设置相同的过期时间,可以在声明队列的时候设置x-message-ttl参数,单位是ms

方法2

为每条消息设置单独的过期时间,可以在生产者发布消息的时候设置Expiration参数,单位为ms

区别

第一种一旦过期,就会从队列中抹去,因为队列中已过期的消息在队列总的头部,RabbitMQ只需要定期扫描头部消息是否过期

第二中消息过期,可能不会立刻从队列中删除,因为此时是在消息将要消费时,才判断是否过期

死信消息

产生死信消息一般有以下情况:

    消息被拒绝(Basic.Reject/Basic.Nack),并设置requeue参数为false 消息过期 队列达到最大长度
经验分享 程序员 微信小程序 职场和发展