欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RabbitMQ简单介绍及常见面试题

程序员文章站 2022-06-09 20:50:12
RabbitMQ简介 MQP 即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用协议的一个开发标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,A ......

rabbitmq简介

  mqp 即advanced message queuing protocol(高级消息队列协议),是一个网络协议,是应用协议的一个开发标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,amqp规范发布。类比http。
  2007年,rabbit技术公司基于amqp标准开发的rabbitmq 1.0发布。rabbitmq采用erlang语言开发。erlang语言由ericson设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。

mq的优势,为什么要使用mq?

  1.应用解耦(提高容错性和可维护性)

  2.异步提速(与数据库串行、并行同理)

  3.削峰填谷(提高系统的稳定性)

  比如:前端发送五千条请求过来,但是后端能处理只有2千条,这时候服务器 就会炸掉,使用mq后,前端与mq交互,mq就根据前端请求量以及后端能处理的数量 去相对缓慢但平缓的向后端发送请求,这样后端就能够处理完成大量请求而不会导致服务器崩溃

mq的劣势

  1.系统可用性降低(系统引入的外部依赖越多,系统稳定性越差,一旦mq宕机会对业务造成影响)——>如何保证mq的高可用?

  2.系统复杂性提高 ——>如何保证消息不被丢失?

常见mq及区别

RabbitMQ简单介绍及常见面试题

 

 

mq的工作模式

1、work queues 2、publish/subscribe 发布与订阅模式 3、routing 路由模式 4、topics 主题模式 5、header 模式 6、rpc 远程调用模式

详情可看官方介绍:

 

mq的设计思路

  1. 可伸缩性: 设计为分布式的,例如分为namebervice和broker;broker负责topic消息存储、管理和分发等功能;bs就是一个注册中心、维护所有brokers信息。这样通过水平扩展就提升了吞吐量和容量了。

  2. 可靠性: 数据要磁盘落地,来做到可恢复、持久化。然后顺序写随机读来提高性能。

  3. 容错性: 多个机器中有的宕机后,要有类似zookeeper的的投票选举功能,确保集群稳定运行。

 

mq常见面试题

1.1、场景\业务

例:

需求:1.下单后,30分钟为支付,取消订单,回滚库存

2.新用户注册成功7天后,发送短信问候

解:使用mq高级特效—延迟队列(设置多久消费这条消息)

p:mq中并未提供延迟队列功能。但是可以使用:ttl+死信队列组合实现延迟队列的效果

1.2、消息积压、重复消费、消息丢失等怎么处理?解决方案?

消息积压:

一般出现消息积压基本上分为几种情况:

  1. 消费者消费消息的速度赶不上生产速度,这总问题主要是业务逻辑没设计好消费者和生产者之间的平衡,需要改业务流程或逻辑已保证消费度跟上生产消息的速,譬如增加消费者的数量等。

  2. 消费者出现异常,导致一直无法接收新的消息,这种问题需要排查消费的逻辑是不是又问题,需要优化程序。

    解决思路:

    1.拆分mq,生产者一个mq,消费者一个mq,写一个程序监听生产者的mq模拟消费速度(譬如线程休眠),然后发送到消费者的mq,如果消息积压则只需要处理生产者的mq的积压消息,不影响消费者mq

    2.拆分mq,生产者一个mq,消费者一个mq,写一个程序监听生产者的mq,定义一个全局静态变量记录上一次消费的时间,如果上一次时间和当前时间只差小于消费者的处理时间,则发送到一个延迟队列(可以使用死信队列实现)发送到消费者的mq,如果消息积压则只需要处理生产者的mq的积压消息,不影响消费者mq

    3.使用redis的list或zset做接收消息缓存,写一个程序按照消费者处理时间定时从redis取消息发送到mq

    4.设置消息过期时间,过期后转入死信队列,写一个程序处理死信消息(重新如队列或者即使处理或记录到数据库延后处理)

重复消费:先说为什么会重复消费:正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;

但是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将消息分发给其他的消费者。

针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;

比如:在写入消息队列的数据做唯一标示,消费消息时,根据唯一标识判断是否消费过;

消息丢失:一.消息持久化

1.exchange设置持久化:durable:true

2.queue设置持久化

3.message持久化发送

二.ack确认机制

1.消息发送确认

2.消息接受确认

三.设置集群镜像模式

四.消息补偿机制

1.3、mq使用场景、为什么使用mq、mq的优劣

1.4、使用mq时遇到什么问题,怎么解决

 

进阶方向图:

RabbitMQ简单介绍及常见面试题