上一篇 <<<Rabbitmq队列模式总结
下一篇 >>>Springboot利用AmqpTemplate整合Rabbitmq
1.设计思路
2.方案说明
2.1 生产者提交给消息服务器时,使用确认机制
channel.confirmSelect();
…………
if (channel.waitForConfirms()) {
System.out.println("发送消息成功");
} else {
System.out.println("发送消息失败");
}
生产者收不到确认的情况:
1)、MQ挂了
2)、MQ满了,
解决办法:每次的生产者消息发送都通过日志表记录下来,后续采用手动补偿即可
2.2 消息服务器对应的队列、交换机等都持久化,保证数据的不丢失
1)、代码设置
2)、控制平台设置---默认都是持久化的。临时的话重启后就会消失
durable是否持久化 durable为持久化、 Transient 不持久化
autoDelete 是否自动删除,当最后一个消费者断开连接之后队列是否自动被删除,可以通过RabbitMQ Management,查看某个队列的消费者数量,当consumers = 0时队列就会自动删除
如果已经设置了持久化,则给生产者确认的时候就是持久化成功后的确认。这样就算硬盘坏了、持久化的过程断电了,都不会影响到消息的丢失,因为生产者收不到确认证明没发送成功。
2.3 消费者采用消息确认机制,保证数据的不丢失
1)、消息队列到消费者的方式有首次主动拉取、后续生产者发送时的主动推送和消费者发生异常时的重试三种方式。
2)、消息应答的方式默认为自动,即消费者收到消息时,队列即删除。如果消费者出现了断电等情况,也会被直接删除。所以要改成手动确认删除后,队列才会真正删除,这样保证了消息的不丢失。
channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
注:第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。
在处理完消息时,返回应答状态,true表示为自动应答模式。
channel.basicAck(envelope.getDeliveryTag(), false);
3.Rabbitmq如何开启持久化的功能
- 默认的情况下mq服务器端创建队列和交换机都是持久化的
- 如果是代码创建的话,将该值设置为durablet
推荐阅读:
<<<消息中间件的核心思想
<<<消息中间件常见问题汇总
<<<基于Netty简单手写消息中间件思路
<<<消息队列常用名词与中间件对比
<<<Rabbitmq基础知识
<<<Rabbitmq示例之点对点简单队列
<<<Rabbitmq示例之工作(公平)队列
<<<Rabbitmq示例之发布订阅模式
<<<Rabbitmq示例之路由模式Routing
<<<Rabbitmq示例之通配符模式Topics
<<<Rabbitmq示例之RPC模式
<<<Rabbitmq队列模式总结
<<<Springboot利用AmqpTemplate整合Rabbitmq
<<<Rabbitmq如何保证幂等性
<<<Rabbitmq的重试策略
<<<Rabbitmq通过死信队列实现过期监听
<<<Rabbitmq解决分布式事务思路
<<<Rabbitmq解决分布式事务demo
<<<Rabbitmq环境安装
<<<Kafka中的专业术语都有哪些
<<<Kafka的设计原理介绍
<<<Kafka集群如何实现相互感知
<<<Kafka如何实现分区及指定分区消费
<<<Kafka如何保证消息顺序消费
<<<Kafka如何保证高吞吐量
<<<Kafka集群环境搭建
<<<RocketMQ架构原理
<<<RocketMQ、RabbitMQ和Kafka的对比
<<<SpringBoot整合RocketMQ示例
<<<RocketMQ保证顺序消费demo
<<<RocketMQ如何动态扩容和缩容
<<<RocketMQ如何解决分布式事务
<<<RocketMQ单机版本安装
<<<RocketMQ集群环境程序启用相关知识点
<<<RocketMQ单机做主备实操
<<<RocketMQ所有配置说明