一、解决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