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,所以消息会自动确认)。

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

相关推荐
spiker_1 小时前
RabbitMQ 常见使用模式详解
分布式·rabbitmq
不能再留遗憾了1 小时前
RabbitMQ 高级特性——持久化
分布式·rabbitmq·ruby
成为大佬先秃头1 小时前
解决RabbitMQ设置TTL过期后不进入死信队列
分布式·中间件·rabbitmq·java-rabbitmq
.生产的驴6 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
月夜星辉雪12 小时前
【RabbitMQ 项目】服务端:路由交换模块
分布式·rabbitmq
super_journey12 小时前
RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)
分布式·中间件·rabbitmq
王彬泽14 小时前
【RabbitMQ】重试机制、TTL
rabbitmq·ttl·重试机制
海里真的有鱼17 小时前
Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能
开发语言·后端·rabbitmq
小宋102120 小时前
玩转RabbitMQ声明队列交换机、消息转换器
服务器·分布式·rabbitmq
xcx0032 天前
快充协议方案,Type-C接口受电端Sink取电快充协议芯片
zookeeper·rabbitmq·flume·memcached·storm