消息中间件RabbitMQ之如何避免消息丢失

为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性。不能让我们的RabbitMq消息丢失。

一.消息持久化:RabbitMQ 的消息默认存放在内存上面,如果不特别声明设置,消息不会持久化保存到硬盘上面的,如果节点重启或者意外crash掉,消息就会丢失。

需要做到消息持久化,以下三个条件缺一不可。

  1. Exchange设置持久化:
    channel.exchangeDeclare(exchangeName, “direct/topic/header/fanout”, true);//在创建exchange时把exchange持久化
    

     

  2. Queue设置持久化:   
    channel.queue_declare(queue='hello', durable=True)//在创建队列对其进行持久化。

     

  3. Message设置持久化:
    channel.basic_publish(exchange='',
    
                          routing_key='hello',
    
                          body='hello',
    
                          properties=pika.BasicProperties(
    
                              delivery_mode=2,  # make message persistent
    
                          ))

    在这里有必要介绍一下basicProperties中常用字段: 

    content_type:

    content_encoding:编码类型

    priority:优先级

    correlationId:用于将RPC响应与请求相关联

    headers:header类型的交换机可以用到

    deliveryMode:消息持久化  1代表不持久化  2代表持久化

    replyTo:用于命名回调队列

    expiration:设置过期消息时间

二.ACK确认机制:Message acknowledgment 机制,就是消费端消费完成要通知服务端,服务端才把消息从内存删除。

 String basicConsume(String queue, boolean autoAck, Consumer callback) throws IOException;

当生产者投递消息到broker,rabbitmq把消息分发到消费者。 如果设置了autoAck=true 消费者会自动确认收到信息。这时broker会立即将消息删除,这种情况下如果消费者出现异常(连接中断)该消息就会丢失。为了保证消息能够被正确的消费,rabbitmq支持消息确认。false代表手动确认。

三.RabbitMQ集群:具体不在这里分析,后续有文章具体讲解。

四:消息补偿机制:

 该解决方案需要对对数据库进行两次io操作,如果数据量很大,将会导致瓶颈的发生,本流程是首先将业务入库,发送消息前,将发送的消息入库消息状态可设置为0,两次写入数据库后,发送消息,消息发送后,mq broker 接收并处理消息,完成后发送回馈消息确认信息,同过确认监听服务器,监听到确认消息后,将其数据库状态更改为1,说明消息发送成功,但是过程中可能出现各种情况导致不能反馈消息,我们需要在添加一个定时轮询任务,比如说设置最大轮询次数为3,时间间隔为5min,每一次当超过5分钟就去检查一次数据库消息状态,如果还是0则,再次发送消息,知道消息状态变为1为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值