学习RabbitMQ

本文详细介绍了RabbitMQ的基本概念、安装步骤、队列、交换机和绑定的使用,以及常见消息传递模式,并提供了Java实现的示例。RabbitMQ在异步任务处理、微服务架构、事件驱动和分布式系统中有广泛应用。
摘要由CSDN通过智能技术生成

简介

RabbitMQ 是一种流行的消息队列系统,用于在应用程序之间可靠地传递消息。它完全支持 AMQP(高级消息队列协议),并提供了丰富的特性来实现可靠的消息传递。

1、基本概念:

消息队列是一种用于在应用程序之间传递消息的通信机制。它包括以下基本概念:

  1. 生产者(Producer)

:生产者是发送消息到消息队列的应用程序或服务。它们生成数据并将其发布到队列中。

  1. 消费者(Consumer)

:消费者是从消息队列接收消息的应用程序或服务。它们订阅(或监听)队列,并在有新消息到达时处理它们。

  1. 队列(Queue)

:队列是消息在消息队列系统中的存储区域。它们按照先进先出(FIFO)的原则存储消息,确保消息按照顺序进行处理。

  1. 交换机(Exchange)

:交换机是消息队列系统中的组件,负责将消息路由到一个或多个队列。它根据特定的路由规则将消息分发到相应的队列。

  1. 绑定(Binding)

:绑定指定了队列和交换机之间的关联关系,定义了消息如何从交换机路由到队列。

AMQP(高级消息队列协议)是一种网络协议,用于在应用程序之间传递消息。它定义了生产者、消费者、队列、交换机和绑定之间的通信规范,以及消息如何被发布、路由和接收。RabbitMQ 是一个流行的消息队列系统,它完全支持 AMQP 协议,并提供了丰富的特性来实现可靠的消息传递。


2、安装 RabbitMQ:

2.1、准备工作

下载erlang:http://www.erlang.org/downloads/

下载RabbitMQ:Installing RabbitMQ | RabbitMQ

2.2、安装Erlang

RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang,双击otp\_win64\_21.1.exe直接安装,选择默认配置即可,如果不安装Erlang或安装错误而直接安装RabbitMQ会弹出如下错误提示;

2.3、设置环境变量

设置Erlang的环境变量和path路径

默认情况下安装程序会生成一个系统环境变量,如果没有生成就自己添加一个

添加到Path中,

配置好之后,打开CMD,输入erl然后回车键,会弹出版本信息,表示Erlang安装成功。


2.4、安装RabbitMQ


直接双击rabbitmq-server-3.7.8.exe进行安装,选择默认配置即可



2.5、安装管理插件

安装Web网页管理插件RabbitMQ-Plugins

安装RabbitMQ-Plugins,这个相当于是一个管理界面,方便我们在浏览器界面查看RabbitMQ各个消息队列以及exchange的工作情况。程序安装好之后默认情况下服务是开启的,这一点可以打开Windows的服务界面查看,





此时再次打开Windows的服务管理界面,可以看见RabbitMQ服务已停止,


然后打开CMD窗口,切换到RabbitMQ安装路径的sbin目录下,

输入指令:“rabbitmq-plugins enable rabbitmq\_management

安装完rabbitmq插件,开启服务,打开开始菜单,RabbitMQ Server->RabbitMQ Service-start开启服务,


 

3、创建队列
 

6、然后打开IE浏览器,可以通过访问http://localhost:15672进行测试,默认的登陆账号为:guest,密码为:guest。

成功登陆之后,如下所示


 

7、添加一个队列

选择Queues页面,打开“Add a new queue”,为队列命名,如“MQ\_Test”,其它选择可以默认,然后点击“Add queue”按钮,



添加成功之后,在“All queues”选项下面会列出刚才创建的队列信息,



 

8、发送“Hello world!!!”测试

在“All queues”列表中选择刚刚创建的队列“MQ\_Test”,会显示“MQ\_Test”的信息页面,主要显示了该队列的网络状态以及速率监控等,然后选择“Publish message”,在“Payload”中输入”Hello world!!!”,



然后点击“Publish message”按钮,就可以发送消息,发送完之后在“Overview”中显示了实时的网络状态,


9、然后选择“Get messages”下拉框,会弹出接收消息的显示界面,点击“Get message”按钮,接收到来自服务器的消息,也就是刚刚发送的“Hello world”,


4、创建交换机
 

在 RabbitMQ Management 界面中,转到 "Exchanges" 页面。

点击 "Add a new exchange" 按钮。

输入交换机的名称、类型(例如 direct、fanout、topic、headers)等信息,然后点击 "Add exchange" 按钮。

5、创建绑定:


  • 转到 "Bindings" 页面。
  • 选择要绑定的交换机和队列。
  • 输入绑定的相关信息,然后点击 "Bind" 按钮。


 

6、常见RabbitMQ传递模式


关于消息传递模式,RabbitMQ支持多种消息传递模式,其中常见的包括:

  1. 点对点(Point-to-Point)

:在点对点模式中,一个生产者发送消息到一个队列,然后一个消费者从该队列中接收消息。消息在队列中按照先进先出的顺序被处理。

  1. 发布/订阅(Publish/Subscribe)

:在发布/订阅模式中,一个生产者发送消息到一个交换机,然后多个队列通过绑定到该交换机来接收消息。每个队列都有自己的消费者来处理消息。消息被交换机广播到所有绑定的队列。

  1. 路由(Routing)

:在路由模式中,消息的路由是根据消息的路由键(routing key)来确定的。交换机根据消息的路由键将消息路由到与之匹配的队列。这种模式允许消息根据指定的规则被路由到不同的队列。

每种模式都有其适用的场景和优势,根据实际需求选择合适的模式来实现消息传递。

7、示例代码(Java 实现)
 

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.14.0</version> <!-- 替换为你需要的版本 -->
</dependency>

7.1 生产者
 

public class RabbitMQProducer {

    /**
     * 生产者
     */
    private static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // RabbitMQ 服务器地址
        factory.setHost("localhost");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            // 声明队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Hello, RabbitMQ!";
            // 发布消息到队列
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

7.2 消费者
 

public class RabbitMQConsumer {

    /**
     * 消费者
     */
    private static final String QUEUE_NAME = "hello";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // RabbitMQ 服务器地址
        factory.setHost("localhost");

        try (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 -> { });
        }
    }
}

8、RabbitMQ环境使用
 

RabbitMQ 在以下情况下非常适用:

  • 异步任务处理
  • :当你的应用程序需要处理大量的异步任务时,例如发送电子邮件、生成报告、处理数据等,可以使用 RabbitMQ 来实现任务队列,确保任务被可靠地分发和处理。
  • 微服务架构
  • :在微服务架构中,各个服务之间需要进行异步通信。RabbitMQ 可以作为微服务之间的消息传递系统,实现服务之间的解耦和灵活性。
  • 事件驱动架构
  • :RabbitMQ 可以用于实现事件驱动架构,其中各个组件可以发布和订阅事件,从而实现松耦合的系统设计。
  • 日志处理
  • :将日志消息发送到 RabbitMQ 中,然后由消费者进行处理和分析,可以实现高效的日志处理系统,以及实时监控和分析。
  • 分布式系统
  • :在分布式系统中,各个节点之间需要进行通信和协调。RabbitMQ 可以作为分布式系统的消息传递中间件,实现节点之间的通信和数据交换。
  • 削峰填谷
  • :当系统面临突发流量时,可以使用 RabbitMQ 来缓冲请求,避免系统过载。生产者可以将请求发送到队列中,消费者按照自身的处理能力逐个处理请求,从而实现流量控制。

简单比喻
 

当你需要让不同的程序或服务之间进行通信时,就可以使用 RabbitMQ。想象一下你在一个繁忙的餐馆工作,服务员收集顾客的订单然后将它们交给厨房。RabbitMQ 就像一个虚拟的服务员,负责接收订单(消息),然后将它们传递给厨房(程序或服务)去处理。

为什么要使用 RabbitMQ 呢?因为有时候厨房可能很忙,如果服务员立刻将订单都送过去,可能会导致混乱。所以,服务员可以先将订单放在服务台上(队列),等待厨房有空的时候再取。这样,服务员和厨房之间的工作就可以更加有序,不会出现太多的混乱。

在这个例子中,订单就是消息,服务员就是生产者(负责发送消息的程序),厨房就是消费者(负责接收并处理消息的程序),服务台就是队列(用来暂时存放消息的地方)。通过 RabbitMQ,你可以确保消息被安全、可靠地传递,并且能够有效地控制消息的流量,避免系统负载过大。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值