头图

1. MQ介绍

MQ(Message Queue)用于在应用程序之间相互通信,在消息中发送数据进行通信,而不需要特意建立连接传输数据。
与之对应的另一种通信方式是远程直接调用(RPC),需要先建立通信连接然后传递数据。

2. RabbitMQ

2.1 简介

RabbitMQ是一个开源的消息队列系统,使用Erlang语言编写的,基于AMQP协议的。
AMQP全程是Advanced Message Queuing Protocol,即高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。具有面向信息、队列、路由(包括点对点和发布/订阅)、可靠性、安全等特征。

2.2 架构:组件解释

RabbitMQ的架构图如下所示:
在这里插入图片描述
下面介绍一下其中的主要概念:

  • Producer:消息生产者,就是投递消息的程序。
  • Connection:AMQP客户端到broker的TCP连接。
  • Channal:在connection内部建立的逻辑练级,这样一个connection能够承载多个访问;
  • Broker:消息队列服务器实体。
  • Virtual Host:虚拟主机,在多个用户使用同一个RabbitMQ服务器的时候,用于进行逻辑隔离,
  • Exchange:消息交换机,它指定消息中的routing key按什么规则,路由到哪个队列。主要的分配类型包括:

    • Direct:点对点(完全匹配)
    • Fanout:广播
    • Topic:主题(规则匹配)
  • Queue:数据队列,消息的载体,每个消息都会被投入到一个或多个队列。
  • binding:是exchange和queue之间的虚拟连接,包含routing key。

    2.3 特点

    RaybbiMQ具有如下特点:

  • 可靠性:持久化、生产确认等传输机制保证传输的可靠性;
  • 灵活路由:使用exchange机制灵活路由,下面会详细介绍;
  • 消息集群:多服务器组成集群;
  • 队列可用性:队列在集群的机器上可以镜像,部分节点出问题不影响整体可用性;
  • 支持多种协议:对于STOMP、MQTT等消息队列协议的支持;
  • 跟踪机制:对于异常消息提供消息跟踪,方便确认异常原因;
  • 用户友好:多语言客户端,管理界面易用,提供多种插件,也允许用户自己实现插件;

2.4 优缺点

  1. 优点
    RabbitMQ具有解耦、异步、削峰的优势;

    • 解耦:

      • 对于数据传入,一般的做法是直接把数据放在传输包中,从发送发传递给接收方,但是对于RaybbiMQ,发送方只需要把数据放在消息队列中,接收方从消息队列中获取数据即可,这样就实现了解耦;
      • 这样的好处是发送发的队列数据持久化,不会因为接收方的问题导致数据丢失,同时队列中的持久化数据可以被多次复用。
    • 异步:

      • 正如解耦部分的解释,读写操作是异步进行的,不需要等待接收方的处理,这样就提高了系统的吞吐量;
    • 削峰:

      • 当在活动日出现大规模交易的时候,如果按照传统的收发操作,会造成服务器的承载负担,相信大家都遇到过服务器崩溃的情况,这对于用户和公司来说都是很糟糕的情况;
      • 使用RabbitMQ的时候,先暂时将客户端的请求数据放在队列中,然后再慢慢处理,这样就可以避免服务器的崩溃。
  2. 缺点

    • 系统复杂度:RabbitMQ的使用会增加系统的复杂度,需要考虑到消息的可靠性、重复消费、消息丢失等问题;

      • 系统可用性:当MQ崩溃的时候,整个系统就会陷入瘫痪,不使用RabbitMQ的时候,只要几个服务节点能够正常运行,整个系统就可以正常运行;
    • 一致性问题:当多个消费者同时对一个队列进行读写,就会产生一致性问题

面试模拟

Q: 为什么选择使用RabbitMQ?
A:因为RabbitMQ具有解耦、异步、削峰的优点,维护消息队列,提高传输的可靠性和读写异步。

参考资料

  1. RabbitMQ 的应用场景以及基本原理介绍
  2. rabbitMQ到底是个啥东西?
  3. 一文带你了解RabbitMQ到底是个什么鬼!

cyl173
1 声望0 粉丝