架构知识总结--2、MQ的架构分析以及多种生产问题解决办法

目录

 

(1)为什么使用消息队列啊?

(2)消息队列有什么优点和缺点啊? 

(3)kafka、activemq、rabbitmq、rocketmq都有什么优点和缺点啊?

(4)是MQ的高可用性怎么保证?

1、RabbitMQ的高可用性 

2、kafka的高可用性 

3、如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?

4、 如何保证消息的可靠性传输(如何处理消息丢失的问题)?

(1)rabbitmq 

1)生产者弄丢了数据 

 2)rabbitmq弄丢了数据

3)消费端弄丢了数据

(2)kafka 

1)消费端弄丢了数据 

 2)kafka弄丢了数据

3)生产者会不会弄丢数据 

5、如何保证消息的顺序性?

错乱的两种场景

保证消息的顺序性

(1)rabbitmq

 (2)kafka

6、如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决? 

(1)大量消息在mq里积压了几个小时了还没解决 

(2)过期数据

(3)数据堆积太多,满了

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)数据堆积太多,满了

写一个程序丢弃的方式消费掉所有消息,并且记录下来,然后在写进去;

发布了469 篇原创文章 · 获赞 94 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_37909508/article/details/99470624
今日推荐