目录
(3)kafka、activemq、rabbitmq、rocketmq都有什么优点和缺点啊?
3、如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?
6、如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
7、 如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路
RabbitMQ
RabbitMQ是AMQP协议实现的
ActiveMQ是基于JMS实现的;
(1)为什么使用消息队列啊?
消息队列的常见使用场景,比较核心的3个:解耦、异步、削峰
解耦:我的电商系统中,当店家修改完商品之后,首先需要对数据库进行修改,然后就是redis缓存、es搜索库以及生成新的静态化页面,如果没有使用mq的话,修改完数据库的微服务必须分别将修改后的商品id发送给redis缓存微服务、es搜索库微服务、静态化页面微服务,非常麻烦;使用了RabbitMq之后,修改数据库的微服务只需要将数据发送给mq,redis缓存微服务、es搜索库微服务、静态化页面微服务监听到之后获取数据就可以了
异步:没有使用mq的时候,我需要修改数据库的微服务之后,再去调用redis缓存微服务,等redis缓存服务器完成之后,再去调用es搜索库微服务,等es搜索库微服务完成之后,再去调用静态化页面微服务,如此所消耗的时候是他们执行的总和;而使用了mq之后,我们只需要计算修改数据库微服务的时候加上发送给mq数据的时间,其他的微服务都是并行执行的,就节省了很多时间;
削峰:处理高峰期情况下,服务器崩溃;可能在平常时间你的服务器的吞吐量就几万,但是高峰期的时候突然涨到几十万,服务器瞬间崩溃,这个时候就需要通过mq来限制访问的请求数量。
(2)消息队列的缺点
系统可用性降低:本来之前只是数据库微服务调用es、redis、静态化页面的接口,将MQ加入进来,MQ管理的这四个微服务之间的消息调用,万一MQ,我的整个电商系统就直接崩溃了。
系统复杂性提高:加入MQ之后,需要去保证消息的重复消费?如何解决消息丢失?怎么保证消息传递的顺序性?
(4)是MQ的高可用性怎么保证
1、RabbitMQ的高可用性
镜像集群模式
RabbitMQ只能实现主从架构集群,无法实现分布式集群。也就是每个结点存放一模一样的queue队列
负债均衡机制:
轮询法
随机法
源地址哈希法:获取的客户端IP地址,进行hash取余
2、kafka的高可用性
kafka一个最基本的架构认识:多个broker组成,每个broker是一个节点;你创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的broker上,每个partition就放一部分数据。
3、如何保证消息不被重复消费(如何保证消息消费时的幂等性)?
怎么保证消息队列消费的幂等性?
(1)比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update一下好吧
(2)比如你是写redis,那没问题了,反正每次都是set,天然幂等性
4、 如何保证消息的可靠性传输(如何处理消息丢失的问题)?
(1)rabbitmq
1)生产者消息丢失
在生产者微服务上开启confirm模式,每次写的消息都会分配一个唯一的id,如果写入mq之后,mq会回传一个ack消息。
2)rabbitmq弄丢了数据
mq开启持久化,消息写入mq之后持久化到磁盘中,在返回ack确认消息给生产者微服务。
3)消费端弄丢了数据
使用消费方微服务的ack机制,只有消息收到且处理完毕之后才返回确认机制。
5、如何保证消息的顺序性?
保证消息的顺序性
(1)rabbitmq
拆分多个queue,每个queue一个consumer
6、如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
(1)大量消息在mq里积压了几个小时了还没解决
1先修复consumer的问题,确保其恢复消费速度
2接着临时征用多台机器来部署consumer,加快消费;
(2)过期数据
手动一个个把他们查出来,然后写进去;
(3)数据堆积太多,满了
写一个程序丢弃的方式消费掉所有消息,并且记录下来,然后在写进去;