MQ组件之RabbitMQ学习

RabbitMQ是一个实现了高级消息队列协议(AMQP)的开源消息代理软件,也被称为面向消息的中间件。其核心组件包括Exchange、Queue、Binding和Message,这些组件在RabbitMQ中扮演着重要的角色。

首先,Exchange负责接收生产者发送的消息,并将这些消息路由到Queue。它有多种类型,如Direct、Topic、Headers和Fanout,通过不同的类型和配置实现不同的路由逻辑。

其次,Queue用于存储消息,直到它们被消费者接收和处理。它是消息的容器,一个消息可以投入一个或多个队列。

然后,Binding是连接Exchange和Queue的桥梁,它负责将两者关联起来,实现消息路由。通常,这是通过路由键(Routing Key)完成的。

最后,Message是RabbitMQ中实际发送的内容,它由消息头和消息体组成。消息头包含诸如Routing-Key、Priority(优先级)等元数据。

RabbitMQ的使用场景非常广泛,如业务解耦。在消息队列之前,系统之间的业务耦合可能通过共享数据、接口调用等方式实现,但现在可以通过RabbitMQ这样的消息中间件进行解耦,提高系统的灵活性和可维护性。

此外,RabbitMQ还可以用于异步处理一些无需即时返回且耗时的操作,这种方式可以大大节省服务器的请求响应时间,提高系统的吞吐量。

在RabbitMQ中,每个vhost(虚拟主机)都拥有自己的队列、交换机、绑定和权限机制,这使得RabbitMQ能够支持多个独立的应用或服务在同一个RabbitMQ实例上运行,而不会相互干扰。

在这个案例中,我们将构建一个基本的消息发布和订阅系统。生产者(Publisher)将消息发送到RabbitMQ服务器,而消费者(Consumer)将从RabbitMQ服务器接收这些消息。

1. 安装RabbitMQ

首先,确保你已经安装了RabbitMQ服务器。你可以从RabbitMQ的官方网站下载并安装。

2. 添加依赖

对于Java项目,你需要添加RabbitMQ的Java客户端库依赖。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.13.2</version> <!-- 请检查并使用最新版本 -->
</dependency>

3. 生产者代码

java 复制代码
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

public class Producer {
    private static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // RabbitMQ服务器地址
        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("UTF-8"));
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

4. 消费者代码

java 复制代码
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;

public class Consumer {
    private static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // RabbitMQ服务器地址
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println(" [x] Received '" + message + "'");
        };
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
    }
}

运行

  1. 启动RabbitMQ服务器。
  2. 运行生产者代码(Producer类),它将发送一条消息到名为"hello"的队列。
  3. 运行消费者代码(Consumer类),它将从"hello"队列中接收并打印消息。

解释

  • 生产者首先建立与RabbitMQ服务器的连接,然后创建一个通道(Channel)。通道是大部分API调用的载体。
  • 生产者声明一个队列(如果它还不存在的话)。在这个例子中,队列的名字是"hello"。
  • 生产者发送一条消息到队列。
  • 消费者也建立连接和通道,并声明相同的队列。
  • 消费者定义一个DeliverCallback,当消息到达时,这个回调将被调用。在这个例子中,回调只是简单地将消息打印到控制台。
  • 消费者通过调用basicConsume开始消费消息。这个方法告诉RabbitMQ传递消息给消费者。消息一旦被消费者接收,就会被从队列中删除(在这个例子中,我们设置autoAcktrue,所以消息会自动确认)。

注意:在实际应用中,你可能需要处理更复杂的场景,如消息的持久化、消息的确认机制、死信队列、交换机类型选择等。此外,对于大规模部署,你还需要考虑连接管理、异常处理、性能优化等方面的问题。

相关推荐
武子康5 小时前
Java-199 JMS Queue/Topic 集群下如何避免重复消费:ActiveMQ 虚拟主题与交付语义梳理
java·分布式·消息队列·rabbitmq·activemq·mq·java-activemq
Wang's Blog6 小时前
RabbitMQ: 消息过期机制与死信队列技术解析
rabbitmq
苦学编程的谢7 小时前
RabbitMQ_7_高级特性(4)
分布式·rabbitmq
赵榕7 小时前
RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费?
分布式·微服务·rabbitmq
kite012113 小时前
Gin 与消息队列集成:使用 RabbitMQ 处理异步任务
golang·rabbitmq·gin
Wang's Blog1 天前
RabbitMQ: 消息可靠性保障机制深度解析与工程实践
rabbitmq
Wang's Blog1 天前
RabbitMQ: 全面安装与运维指南之从基础部署到高级配置
运维·分布式·rabbitmq
小坏讲微服务1 天前
Spring Boot4.0整合RabbitMQ死信队列详解
java·spring boot·后端·rabbitmq·java-rabbitmq
xrkhy1 天前
canal1.1.8+mysql8.0+jdk17+rabbitMQ+redis的使用02
前端·redis·rabbitmq
Haooog2 天前
RabbitMQ面试题(不定时更新)
分布式·后端·面试·rabbitmq·消息中间件