Skip to content

logo

从0到1开始RabbitMQ

提示

最好的学习文档是🍒官方

RabbitMQ是什么

RabbitMQ是一个由erlang语言开发的基于AMQP协议的开源消息队列中间件。

RabbitMQ的特点

  • 可靠性:使用一些如持久化、传输确认及发布确认等机制来保证可靠性。
  • 灵活路由:在消息进入队列之前,通过交换器来路由消息。RabbitMQ提供了一些内置的交换器实现了典型的路由功能。对于复杂的路由功能,可以将多个交换器绑定在一起,亦可使用插件机制实现自己的交换器。
  • 扩展性:多个RabbitMQ节点可以组成一个集群,亦可根据实际业务情况动态扩展集群中的节点。
  • 高可用性:队列可以再集群中的集群上设置镜像,使得在部分节点出现问题的情况下队列仍可用。
  • 多种协议:除原生支持AMQP协议外,还支持STOMPMQTT等多种消息中间件协议。
  • 多语言客户端:几乎支持所有常用语言,如JavaPythonRubyPHPC#JavaScript等。
  • 管理界面:提供了易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
  • 插件机制:提供许多插件以满足多方面的需求,同时用户可以自编写自己的插件。

RabbitMQ原理图和基础概念

RabbitMQ详解图

工作原理

  • 生产者将消息发送到交换器。
  • 交换器根据路由键将消息路由到一个或多个队列中。
  • 消费者从队列中获取消息并进行处理。
  • 消费者处理完消息后,将确认信息发送给RabbitMQ
  • RabbitMQ收到确认信息后,从队列中删除该消息。

基础概念


实例(Broker)

RabbitMQ 服务器实例,它接收来自生产者的消息并将其路由到一个或多个消费者。Broker 还负责管理队列、交换机和绑定等组件,以确保消息能够正确地传递到目标消费者。

连接(Connection)

应用程序与RabbitMQ Broker之间建立的TCP连接。可以用于发送或接收AMQP帧,包括创建、删除队列、交换器、绑定等操作,以及发送、接收消息等操作。

信道(Channel)

在一个TCP连接上建立的一个独立的逻辑通道,用于进行AMQP操作。通过Channel,应用程序可以在一个Connection上发送和接收多个AMQP帧,每个Channel都是一个独立的逻辑通道,可以进行独立的AMQP操作。

虚拟主机(Virtual Host)

逻辑上的概念,用于将RabbitMQ的资源(如队列、交换器和绑定等)划分为不同的逻辑组。每个Virtual Host都是一个独立的消息路由器,可以有自己的权限和策略,不同的Virtual Host之间相互隔离,可以避免资源冲突和安全问题。

作用:

  • 逻辑隔离Virtual Host可以将RabbitMQ的资源进行逻辑隔离,不同的应用程序或团队可以使用各自独立的Virtual Host,避免资源冲突和干扰。
  • 权限控制Virtual Host可以为不同的用户或应用程序提供不同的权限,以控制对RabbitMQ资源的访问和使用。
  • 策略管理Virtual Host可以为不同的资源设置不同的策略,如消息过期时间、队列长度限制和消息优先级等,以满足不同的业务需求。

默认会创建"/"的Virtual Host

消息(Message)

RabbitMQ中的基本单位,包含一个消息体和一些元数据,如路由键、交换器等。

交换器(Exchange)

接收生产者发送的消息,并将其路由到一个或多个队列中。交换器有四种类型:directfanouttopicheaders

direct

  • 含义:直接交换器。根据消息的路由键将消息路由到指定的队列中。

  • 使用场景:适用于一对一的消息传递模式。例如,发送给特定用户的消息。

fanout

  • 含义:扇形交换器。将消息广播到所有绑定的队列中。
  • 使用场景:适用于发布/订阅模式。例如,向多个消费者发送同一份消息。

topic

  • 含义:主题交换器。根据通配符匹配路由键将消息路由到一个或多个队列中。
  • 使用场景:适用于灵活的消息传递模式。例如,根据商品类别和地区将消息路由到不同的队列中。

headers

  • 含义:头交换器。根据消息头中的键值对匹配将消息路由到一个或多个队列中。
  • 使用场景:适用于复杂的匹配规则。例如,根据消息头中的IP地址和协议类型将消息路由到不同的队列中。

队列(Queue)

存储消息的缓冲区,生产者将消息发送到交换器,交换器再将消息路由到队列中。消费者从队列中获取消息。

绑定(Binding)

用于将交换器和队列连接起来,绑定规则由路由键控制。

路由键(Routing Key)

由生产者设置,用于指定消息的路由规则。

消费者(Consumer)

从队列中获取消息并进行处理的应用程序。

生产者(Producer)

将消息发送到RabbitMQ的应用程序。

RabbitMQ为什么需要Channel,而不直接使用Connection通信?

RabbitMQ安装和配置

本地方式

docker方式

yaml

安装和配置

  • 下载并安装RabbitMQ
  • 配置RabbitMQ,比如设置用户权限、虚拟主机等

RabbitMQ使用入门

  • 使用RabbitMQ的命令行工具进行简单的消息发送和接收
  • 通过代码使用RabbitMQ进行消息发送和接收

快速开始之“Hello World”

Simple Mode

新建一个Maven项目,添加rabbitmq客户端依赖库和slf4j简单实现库

xml
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
  <groupId>com.rabbitmq</groupId>
  <artifactId>amqp-client</artifactId>
  <version>5.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.30</version>
</dependency>

Producer端

java
package com.xiaoshengsheng.rabbitmq.helloworld;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @author Julius Wong
 * @date 2020/8/4 4:42 下午
 */
public class Sender {
  private static final String QUEUE_NAME = "hello";

  public static void main(String[] args) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    try (Connection connection = factory.newConnection();
         Channel channel = connection.createChannel()) {
      channel.queueDeclare(QUEUE_NAME, false, false, false, null);
      String message = "Hello World";
      channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    }
  }
}

几种工作模式

Work Queues模式

Work Queues mode

Publish/Subscribe模式

Publish-Subscribe mode

Routing模式

Routing mode

Topics模式

topics mode

Header模式
RPC模式

RPC mode

整合SpringBoot使用

Spring AMOP是将Spring核心思想应用于基于AMQP的消息传递解决方案的开发,提供了一个发送接收消息的高级抽象的模板。

新建一个SpringBoot项目,依赖amqp的starter

xml
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

配置application.properties

properties
# 方式一:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# 方式二:
# spring.rabbitmq.addresses=amqp://guest:guest@localhost

常见场景

消息优先级
延迟消息

RabbitMQ高级特性

  • 学习如何使用RabbitMQ的高级特性,如Exchange类型、Queue参数、消息确认机制等
  • 学习如何处理RabbitMQ的异常情况,如网络故障、持久化问题等

RabbitMQ集群和高可用性

  • 学习如何搭建RabbitMQ集群,提高可用性
  • 学习如何进行RabbitMQ的负载均衡和故障转移