• 作者:老汪软件技巧
  • 发表时间:2024-09-27 15:01
  • 浏览量:

在上一篇文章中我们讲到了如何在Windows中安装Rabbitmq,小白也能搞定!手把手教你在 Windows 安装 RabbitMQ我们先安装了Erlang环境,之后又安装了Rabbitmq,最后我们通过安装Rabbitmq的web管理端成功验证了,但是相信大家进入Rabbitmq的管理页面都和作者一样傻眼了,这么多的页签,这都什么意思啊???

所以这次我们来结合代码和页面对应的功能来入门一下Rabbitmq的基础名词和他们的概念。

在说Rabbitmq之前,我们需要了解一下什么是消息队列?

消息队列(Message Queue, MQ)是一种软件设计模式,也是一种中间件技术,它允许应用程序通过网络进行异步通信。在消息队列中,消息被发送到队列中,接收端(消费者)可以从队列中取出这些消息进行处理。消息队列的设计目的是为了实现异步处理、解耦服务以及提升系统的可扩展性和健壮性。

消息队列(Message Queue, MQ)是一种应用程序间的通信方法,它允许多个组件之间通过异步方式传递数据。消息队列的主要目的是解耦系统组件,提高系统的可扩展性和健壮性。在消息队列中,生产者发送消息,消费者接收消息,中间件(通常是消息队列服务)负责存储和转发消息。

那他在我们工作中应该怎么用呢?

假设我们正在开发一个电子商务网站,当用户提交订单时,前端向订单服务发送一个请求,订单服务创建订单并将相关信息(例如订单号、商品信息等)放入消息队列。然后,订单服务立即返回给前端,告诉用户订单已提交。此时,后台的订单处理服务从消息队列中读取新订单的消息并开始处理订单,如检查库存、扣减库存、计算运费等。

这种方式的好处是,订单服务可以立即响应用户,而无需等待耗时的操作完成,从而提高了用户体验。同时,如果订单处理服务暂时不可用或者处理速度较慢,也不会影响到用户的即时体验。

好了,这下简洁明了的介绍了一下MQ,那么我们来认识一下Rabbitmq。

RabbitMQ 是一个在分布式系统中实现消息传递的应用程序,它基于 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)标准。RabbitMQ 由 LShift 和 NetBM 公司在 2007 年开发,并于 2010 年被 Pivotal 软件公司收购。它是用 Erlang 语言编写的,这使得它非常擅长处理大量的并发连接。市面上有很多的MQ产品,例如kafka,RocketMQ等,而Rabbitmq也是MQ系列产品中的一个产品。

认识Rabbitmq基础模式:

在最新的版本中Rabbitmq有七种模式

"Hello World!":

Work Queues:

Publish/Subscribe (Pub/Sub):

Routing:

Topics:

RPC (Remote Procedure Call):

Publisher Confirms:

好了,说了这么多,可以介绍一下web管理端了

RabbitMQ 的 Web 管理界面提供了丰富的工具来监控和管理 RabbitMQ 服务器的状态和配置。

Overview

Totals

如果我们使用sdk发送一条消息的话:

 @Test
    public void testSend() throws Exception {
        //创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置主机
        connectionFactory.setHost("127.0.0.1");
        //设置端口
        connectionFactory.setPort(5672);
        //设置连接的虚拟主机
        connectionFactory.setVirtualHost("/local");
        //设置用户名和密码
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //获取连接对象
        Connection connection = connectionFactory.newConnection();
        //获取连接通道
        Channel channel = connection.createChannel();
        //通道绑定消息队列
        channel.queueDeclare("test-send", false, false, false, null);
        //发部消息
        channel.basicPublish("", "test-send", null, "hello rabbitmq".getBytes());
        channel.close();
        connection.close();
    }

我们就会在Totals下的Message rates和Queued messages的仪表盘中看到一条曲线。

Message Rates

消息的发送速率(publish rate)和消费速率(deliver rate),帮助管理员了解当前系统的消息吞吐量,并评估系统的性能和负载情况。

_RabbitMQ的Web管理页面给我看懵了,这都什么意思啊_RabbitMQ的Web管理页面给我看懵了,这都什么意思啊

Queued Messages

当前队列中等待处理的消息总数,帮助管理员了解队列中积压的消息量,并判断系统是否存在消息积压问题及积压程度。

这个页面下后面的配置项就不做过多介绍,包括:

NodesChurn StatisticsPorts and ContextsExport DefinitionsImport DefinitionsConnections

我们把上面发送消息的代码改造一下,让他在关闭之前线程睡一下,我们就可以发现有一个Connection连接:

 @Test
    public void testSend() throws Exception {
        //创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置主机
        connectionFactory.setHost("127.0.0.1");
        //设置端口
        connectionFactory.setPort(5672);
        //设置连接的虚拟主机
        connectionFactory.setVirtualHost("/local");
        //设置用户名和密码
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //获取连接对象
        Connection connection = connectionFactory.newConnection();
        //获取连接通道
        Channel channel = connection.createChannel();
        //通道绑定消息队列
        channel.queueDeclare("test-send", false, false, false, null);
        //发部消息
        channel.basicPublish("", "test-send", null, "hello rabbitmq".getBytes());
        Thread.sleep(100000);
        channel.close();
        connection.close();
    }

所以这里主要的代码就是这里:

   //获取连接对象
        Connection connection = connectionFactory.newConnection();

通过这个我们就可以在管理端看到对应的连接了

name的tab点击进来后就可以看到我们连接的具体信息了:

包含了一个连接的详细信息,包括连接名称、数据传输速率、连接细节、通道列表和客户端属性

Channels

而这里就是因为上面的这行代码:

        //获取连接通道
        Channel channel = connection.createChannel();

点击Channel的tab标签也可以看到详细信息

包含了某个特定通道的详细信息,包括消息速率、通道状态、未确认的消息数、消费者数量和高级运行时指标。

在 RabbitMQ 中,连接(Connection)和通道(Channel)之间存在着密切的关系。连接是客户端与 RabbitMQ 服务器之间的物理通信路径,而通道是在连接之上建立的逻辑信道,用于执行各种操作,如发布消息、订阅队列等。

一个连接可以同时打开多个通道,每个通道都有自己的生命周期,独立于其他通道。多个通道共享同一个连接的资源,如心跳检测和认证信息。不同通道之间的操作相互隔离,不会互相影响。

Exchanges

交换机(Exchange)是一个消息分发中心,它接收生产者发布的消息并根据预设的规则将其转发到适当的队列。

可以看到rabbitmq中默认有七个交换机,他们的作用分别是:

这些交换机在 RabbitMQ 中已经预置好,用户可以直接使用,也可以根据需要创建自己的交换机。

具体什么是交换机,我们说我队列再讲。

Queues

队列,这是MQ最核心的一个机制了,而这也是我们的这一行代码创建的:

        //通道绑定消息队列
        channel.queueDeclare("test-send", false, false, false, null);