82.分布式消息中间件-RabbitMQ消息确认机制&公平队列&发布订阅实现原理

一、解决Rabbitmq创建账号权限的问题

在这里插入图片描述
在这里插入图片描述

二、Rabbitmq上节课内容简单回顾

在这里插入图片描述
vitualhost类似数据库的分库

在这里插入图片描述

三、传统的队列存在那些缺陷

点对点

在这里插入图片描述
多个消费者,会 轮询均摊

在这里插入图片描述

四、Rabbitmq消费者如何实现手动ack

消费者和MQ服务器端第一次建立链接时:拉取消息

推送消息

在这里插入图片描述
RabbitMQ如何保证消息不丢失
1.使用消息确认机制+持久技术
A.消费者确认收到消息机制
channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
注:第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。
在处理完消息时,返回应答状态,true表示为自动应答模式。

channel.basicAck(envelope.getDeliveryTag(), false);

B.生产者确认投递消息成功 使用Confirm机制

如何实现公平消费:采用手动ack机制

主动拉取消费者和MQ服务器第一次建立连接的时候
主动推送: 消费者已经和MQ服务端保持长连接了,只要生产者投递消息,MQ服务端会立即将消息转发给消费者

五、Rabbitmq如何实现公平队列

在这里插入图片描述

公平队列实现原理:

Mq服务器端每次只会给消费者发送一条消息,如果消费者没有返回ack,就不会继续发送消
息。
如果消费者能够非常快速的告诉给MQ ack 说明呢?

六、如何保证消息中间件消息不丢失

如何保证消息不丢失?

1.生产者 确保我们的生产者将消息投递到MQ成功消息确认机制
如果开启了消息持久化的机制必须消息持久化成功才会应答给生产者
2.消费者 确保我们的消费者消费消息成功 采用手动ack确认
3.MQ服务器端 需要将数据持久化到我们的硬盘

其他情况下: 硬盘坏了、持久化的过程断电了
如何解决 最好通过表记录每次生产者投递消息,如果长期没有被消费手动的补偿消费

A.消费者确认收到消息机制

channel.basicAck(envelope.getDeliveryTag(), false);

生产者发送消息成功

channel.waitForConfirms()

如果在生产者投递消息失败的情况,在那些场景

1.MQ挂了
2.Mq拒绝接受消息 (队列满了
就采用手动补偿或者日志表记录下即可

七、如何开启Rabbitmq持久化功能

Rabbitmq如何开启持久化的功能

1.默认的情况下mq服务器端创建队列和交换机都是持久化
2.如果是代码创建的话,将该值设置为durablet
在这里插入图片描述
在这里插入图片描述

八、Rabbitmq发布订阅的实现原理

发布 订阅
在这里插入图片描述
在这里插入图片描述

Rabbitmq发布订阅的实现原理:

核心思想:
一个生产者投递消息,可以被多个不同的队列实现消费
实现原理:
多个不同的队列绑定相同交换机,生产者只需要将消息投递到交换机之后,在由交换机将消息转发到所有绑定的队列实现消费。

九、Rabbitmq实现发布订阅功能

在这里插入图片描述
绑定交换机:
在这里插入图片描述

刚刚创建的交换机是:持久化
源码:
在这里插入图片描述
此处要求: 非持久化
在这里插入图片描述
代码是重载的:
在这里插入图片描述
制定持久化:再加一个入参
在这里插入图片描述

关联队列消费者关联队列

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");

2。报错

在这里插入图片描述
该vituralhost下没有该队列。 页面手动创建queues
在这里插入图片描述
在这里插入图片描述

发布了119 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44722978/article/details/103514093