一、如何防止消息丢失?(保证消息的可靠性投递)

生产者开启confirm 模式;
生产者开启return机制;
持久化消息,交换机,队列;
消费者 自动ack 转为手动ack;

二、如何防止重复消费?(保证消息的幂等性消费)

1、为什么会重复消费?

正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;
情况1:消费者收到消息后,提交,网络出故障,RabbitMQ服务器没收到提交消息,那么此消息会被重新放入队列,会再次发给消费者。
情况2:接收到消息并处理结束了,此时消费者挂了,没有手动提交消息。

2、防止重复消费?

保证消息的唯一性,
这个问题针对业务场景来答分以下几点:
如果消息是做数据库的insert操作,给这个消息做一个唯一主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。
如果消息是做redis的set的操作,不用解决,因为无论set几次结果都是一样的,set操作本来就算幂等操作。
如果以上两种情况还不行,可以准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。

三、rabbitmq消费失败 怎么办会怎样?

消费者返回nack,设置参数拒绝还是重试;(一般都是选择拒绝);
如果队列绑定了死信队列,消息就存到死信队列中,
如果队列未绑定了死信队列,消息就丢失。

三、如何来保证消息的顺序?

四、发送消息 如何保证事务?