rabbitmq, spring cloud, dubbo
j微服务框架
一、rabbitmq
1.RabbitMQ如何确保消息发送 ? 消息接收?
导致生产者消息丢失有哪些原因?
生产者发送的消息没有到达交换机
生产者发送的消息发送的消息到达交换机,但是交换机没有将消息转发到消息队列
队列中的消息未被消费MQ宕机了
MQ中的消息默认存放在内存中,MQ宕机重启,丢失
如何解决生产者消息丢失问题
前2个问题可以利用消息的确认机制
什么是消息确认机制
生产者发送消息到rabbitmq,rabbitmq会给生产者返回结果;
消息确认机制的作用
通过消息确认机制,生产者可以根据mq返回结果知道消息是否成功发送到了rabbitmq
消息确认机制分类
publish-comfirm
生产者发送消息到交换机消息确认
成功:ack
失败:nack
publish-return
交换机转发消息队列的消息确认
失败:nack
后1个问题可以利用消息持久化
消费者消息确认机制
消费者确认消息的三种模式
none,消费者从MQ中获取消息,无论是否出现异常,rabbitmq都会将消息从消息队列中删除
manual
通过手动编码方式,告诉rabbitmq消息已经进行了消费,rabbitmq会自动将消息删除
auto(默认),根据消费者是否有抛出异常,自动告诉rabbitmq,消费者是否成功消费了消息;
消费者确认模式的配置方式是什么?
消费者的application.yml
2.在RabbitMQ中常见工作工作模式?
https://www.rabbitmq.com/getstarted.html
简单工作模式
工作队列模式
发布订阅模式
路由模式
Topic模式
RPC模式
3.RabbitMQ死信队列、延时队列
死信
一个消息如果出现以下三种情况就会成为死信
被消费者拒绝掉的消息
在消费者的方法中定义一个Channel
channel.basicReject();
消息过期(演示)
在创建消息队列的时候,可以给消息设置存活时间x-message-ttl,如果在存活时间内,消息没有被消费,消息就成为死信
消息队列堆积满了溢出的消息
创建消息队列的时候,可以给消息队列设置长度x-max-length,如果队列中的消息堆积满了,溢出的消息就成为了死信
死信的去向
消息成为死信后第一种情况是被丢弃
如果队列指定了死信交换机,消息就会进入死信交换机,由死信交换机路由到死信队列
死信交换机
普通交换机所以可以为任何类型【Direct、Fanout、Topic】
在RabbitMQ中利用死信交换机 + 消息ttl
4.简述RabbitMq的交换机类型
Direct(路由)
Fanout(发布订阅)
Topic(通配符)
5.rabbitmq可以直连队列么.
不能
简单工作模式好像不用交换机?
底层使用的是默认交换机
6.简述rabbitmq的持久化机制.
消息持久化(自讲)
交换机如何持久化?
在RabbitMQ中我们要保证交换机持久化,否则当MQ宕机后重启,交换机丢失
队列如何持久化?
在RabbitMQ中我们要保证队列,否则当MQ宕机后重启,队列丢失
消息持久化
7.简述rabbitmq的普通集群模式.
普通集群
分布式集群,消息队列分散在集群的不同节点;
消息也是分散在集群的不同节点
如果某个节点宕机,分散在这些节点上的队列不能使用
8.rabbitmq的镜像集群.
镜像集群
什么是镜像集群?
基于主从架构的集群,同一个队列可能在多个节点上都有
主节点
创建队列的节点称为主节点
什么是镜像节点
备份到其他节点的节点称为镜像节点
主节点和镜像节点是相对的;
备份策略
exactly
指定镜像节点具体数字
rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
all
集群中其他节点都会备份
rabbitmqctl set_policy ha-all "^all\." '{"ha-mode":"all"}'
nodes
指定那些节点备份
rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
缺点:仅仅保证主从节点的最终一致性
9.kafka如何保证消息消费的顺序性
1.kafka的主题采用分区机制实现消息的物理存储。
2.一个主题在物理上可以有多个分区
3.生产者发送消息的时候,消息采用key的hash算法进入不同的分区。
4.生产者发送的多个消息可能会进入不同的分区。
4.消费者从不同分区中进行消息消费的时候,这个顺序和发送的顺序就不一定是一致的。
如何保证顺序性呢?
1.可以采用自定义的路由算法,让key进入统一分区,分区中的消息是有序的,让一个消费者从该分区中进行消息消费
2.消费者在进行消息消费的时候可能是采用多线程的方式进行消费,每个线程的处理效率不用。所以也无法保证有序性,单个分区也可能出现无序性问题.
消费者将获取到的消息放入阻塞队列,消费者单独开一个线程从阻塞队列中获取消息。
10.RabbitMQ如何保证消息消费的顺序性
这个问题产生的原因
RabbitMQ的一个交换机可以绑定多个队列
生产者在发送消息的时候,不同的消息可以路由到不同的队列
消费者从不同的队列获取消息,导致消息的发送顺序和消费顺序不一致;
解决
将消息发送到同一个队列,消息在队列中是有序的。
定义一个消费者从该队列获取消息。
消费者在进行消息消费的时候可能是采用多线程的方式进行消费,每个线程的处理效率不用。所以也无法保证有序性,同一个队列中的消息也无法保证顺序性。
消费者将获取到的消息放入阻塞队列,消费者单独开一个线程从阻塞队列中获取消息。
11.幂等性
计算机领域
方法多次被执行和第一次执行的影响是一样的。
用户的重复提交或者恶意请求导致接口被多次重复请求。
微服务架构中,为了避免网络抖动导致的数据丢失,在服务之间通信的时候采用超时重试机制。这种机制有可能导致接口被重复访问。
所以在数据变更的接口中要保证幂等性。
幂等性要保证这个接口执行的结果只影响一次,后续再次调用也不能产生影响。
3.乐观锁。