RabbitMQ 核心功能详解

引言

在现代分布式系统中,消息队列已经成为一种不可或缺的组件。它不仅能够实现应用之间的解耦,还能提高系统的灵活性和可扩展性。RabbitMQ 是一款基于 AMQP(Advanced Message Queuing Protocol)协议的消息中间件,以其强大的功能、稳定性和易用性而广受欢迎。本文将详细解析 RabbitMQ 的核心概念及其使用方法,并通过具体的示例代码来演示如何快速上手。


1. RabbitMQ 安装与环境配置

1.1 Erlang 环境安装

RabbitMQ 使用 Erlang 语言开发,因此在安装 RabbitMQ 之前需要先安装 Erlang 运行时环境。对于 Ubuntu Linux 用户,可以使用以下命令进行安装:

sudo apt-get update
sudo apt-get install erlang

确保 Erlang 版本与 RabbitMQ 兼容,通常推荐使用最新版本的 Erlang 来获得最佳性能和兼容性。

1.2 RabbitMQ 服务器安装

安装完 Erlang 后,就可以开始安装 RabbitMQ 了。Ubuntu 用户可以通过以下命令来添加 RabbitMQ 的官方 APT 源并完成安装:

echo "deb http://www.rabbitmq.com/debian/ bionic main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install rabbitmq-server

安装完成后,启动服务并检查其状态:

sudo systemctl start rabbitmq-server
sudo systemctl status rabbitmq-server

如果一切正常,RabbitMQ 服务应该已经运行起来了。

1.3 开启管理插件

为了方便管理和监控 RabbitMQ 服务器,我们可以启用 Web 管理插件。这允许我们通过浏览器访问一个图形界面来查看队列、交换机等信息。

sudo rabbitmq-plugins enable rabbitmq_management

现在,您可以通过 http://<server-ip>:15672 访问管理界面,默认的用户名和密码都是 guest。出于安全考虑,在生产环境中请更改默认凭据。


2. RabbitMQ 核心概念

2.1 生产者 (Producer) 和消费者 (Consumer)

RabbitMQ 的工作模式类似于邮局系统。生产者创建消息并发送给 RabbitMQ 服务器,相当于邮件发件人;消费者接收来自 RabbitMQ 服务器的消息,类似邮件收件人。RabbitMQ 服务器则扮演着“邮局”的角色,负责存储消息直至被消费或根据设定规则处理这些消息。

2.1.1 生产者的职责
  • 创建消息。
  • 将消息发布到指定的交换机。
  • 可以设置消息的属性如持久化标志等,以便控制消息的行为。
2.1.2 消费者的职责
  • 连接到 RabbitMQ 服务器。
  • 声明或绑定至某个队列。
  • 从队列中拉取消息进行处理。

2.2 连接 (Connection) 与通道 (Channel)

  • 连接 (Connection):是客户端与 RabbitMQ 服务器之间的一个 TCP 连接,为数据传输提供基础。
  • 通道 (Channel):是在 Connection 上建立的一个虚拟连接,用于执行实际的数据操作如发送/接收消息。多个 Channel 可以共享同一个 Connection,这样可以减少资源开销并提高效率。

2.3 虚拟主机 (Virtual Host)

虚拟主机是一种逻辑隔离机制,允许多个用户在同一台物理机器上拥有独立的工作空间。每个 Virtual Host 都有自己的队列、交换机等资源。这种设计有助于组织大型项目中的不同组件,确保它们互不干扰。

2.4 队列 (Queue)

队列是消息的实际存储位置。消息被生产者发送后会进入队列等待被消费。多个消费者可以订阅同一个队列,但每条消息只能由其中一个消费者处理。

2.5 交换机 (Exchange)

交换机的作用是对消息进行路由,决定消息最终会被投递到哪些队列。RabbitMQ 支持多种类型的交换机,包括但不限于:

  • Direct Exchange:直接匹配 routing key。
  • Fanout Exchange:广播所有消息给绑定的所有队列。
  • Topic Exchange:基于通配符匹配 routing key。
  • Headers Exchange:忽略 routing key,而是根据消息头部字段来进行匹配。

2.6 消息传递流程

  1. 生产者创建一条消息并将其发送给特定的交换机。
  2. 交换机根据预定义的规则(例如 binding key)将消息路由到相应的队列。
  3. 消费者监听对应的队列,并在消息到达时对其进行处理。


3. RabbitMQ 管理界面介绍

RabbitMQ 提供了一个直观的 Web 管理界面,可以帮助管理员轻松地监控和管理系统。主要功能区域包括 Overview、Connections、Channels、Exchanges、Queues 和 Admin 等。其中,

  • Overview 展示系统概览信息。
  • Connections 显示当前所有的客户端连接。
  • Channels 列出每个连接下的活动通道。
  • Exchanges 展现已声明的交换机列表及其详情。
  • Queues 显示所有队列的状态,包括消息数量等指标。
  • Admin 用于管理用户账户及权限分配。

3.1 用户相关操作

在 Admin 页面下,你可以执行添加、删除以及修改用户的操作。具体步骤如下:

  • 添加新用户:点击 Add a new user -> 输入账号密码 -> 设置权限 -> 点击 Add User 完成创建。
  • 编辑或删除用户:选择目标用户 -> 在详情页内更新信息或执行删除操作。

3.2 虚拟主机相关操作

同样在 Admin 页面中,可以对虚拟主机进行管理,比如创建新的 vhost 或删除不再需要的 vhost。创建过程很简单:点击 Add a new virtual host -> 输入名称 -> 确认即可。

4. 示例代码演示

接下来我们将通过 Java 编程语言展示如何利用 RabbitMQ 发送和接收消息。首先确保您的项目中包含了必要的依赖项。如果您使用 Maven 构建工具,可以在 pom.xml 文件里加入如下依赖:

<dependencies>
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.15.0</version>
    </dependency>
</dependencies>

4.1 生产者端代码

生产者程序的主要任务是向 RabbitMQ 发送消息。下面是一个简单的例子:

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

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

    public static void main(String[] args) throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setUsername("study");
        factory.setPassword("study");

        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());
            
            System.out.println(" [x] Sent '" + message + "'");
        }
    }
}

这段代码首先设置了连接参数,然后创建了到 RabbitMQ 服务器的连接。之后,它声明了一个名为 hello 的队列,并向该队列发送了一条文本消息 "Hello World!"

4.2 消费者端代码

消费者程序的任务是从队列中读取消息并处理。以下是对应于上面生产者程序的消费者代码:

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

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

    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setUsername("study");
        factory.setPassword("study");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            // 声明队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            // 定义消费者行为
            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 -> {});
        }
    }
}

这里,消费者同样设置了连接参数,并建立了与 RabbitMQ 服务器的连接。接着声明了同样的队列 hello 并指定了一个回调函数来处理收到的消息。每当有新消息到达时,这个回调就会被调用,并打印出消息内容。


以上就是今天的内容,感谢阅览!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893602.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能】人工智能的10大算法详解(优缺点+实际案例)

人工智能&#xff08;AI&#xff09;是现代科技的重要领域&#xff0c;其中的算法是实现智能的核心。本文将介绍10种常见的人工智能算法&#xff0c;包括它们的原理、训练方法、优缺点及适用场景。 1. 线性回归&#xff08;Linear Regression&#xff09; 模型原理 线性回归…

2021年10月自考《软件开发工具》03173试题

目录 一.选择题 二.填空题 三.简答题 五.综合题 一.选择题 1.下列各项属于集成化开发工具的是 &#xff08;书中&#xff09;P96页 A.WORDSTAR B.FLOW C.Dictionary/3000 D.Visual Studio 2.软件工程的思想主要服务于 &#xff08;书中&#xff09;P84页面 A.用户 B.项目…

虚拟现实辅助工程技术在现代汽车制造中的重要性

虚拟现实辅助工程&#xff08;VR Aided Engineering&#xff09;&#xff0c;简称VAE&#xff0c;作为数字化转型的重要手段&#xff0c;在各行各业被越来越广泛的应用。随着汽车变得越来越复杂&#xff0c;虚拟现实辅助工程技术逐渐成为汽车行业产品开发过程中不可或缺的一部分…

Redis --- 第四讲 --- 常用数据结构 --- string类型

一、认识数据类型和编码方式 有序集合&#xff0c;相当于除了存储member之外&#xff0c;还需要存储一个score&#xff08;权重&#xff0c;分数&#xff09; Redis底层在实现上述数据结构的时候&#xff0c;会在源码层面&#xff0c;针对上述实现进行特定的优化&#xff0c;来…

3 机器学习之假设空间

归纳(induction)与演绎(deduction)是科学推理的两大基本手段。前者是从特殊到一般的“泛化”(generalization)过程&#xff0c;即从具体的事实归结出一般性规律&#xff1b;后者则是从一般到特殊的“特化”(specialization)过程&#xff0c;即从基础原理推演出具体状况。例如&a…

学习JAVA中的Spring MVC常用注解及三层架构,这一篇就够了

Spring Web MVC 一&#xff1a;什么是 Spring Web MVC&#xff1f;什么是Servlet呢&#xff1f;什么是Servlet API1.1 MVC 定义1.2 什么是Spring MVC ?1.3SpringBoot和SpringMVC的区别 二&#xff1a;Spring MVC中常用注解的使用2.1 RequestMapping:地址映射2.2 RequestBody:请…

Golang | Leetcode Golang题解之第476题数字的补数

题目&#xff1a; 题解&#xff1a; func findComplement(num int) int {highBit : 0for i : 1; i < 30; i {if num < 1<<i {break}highBit i}mask : 1<<(highBit1) - 1return num ^ mask }

大模型缺的脑子,终于在智能体上长好了

智能体是一种通用问题解决器&#xff0c;从软件工程的角度看来&#xff0c;智能体是一种基于大语言模型的&#xff0c;具备规划思考能力、记忆能力、使用工具函数的能力&#xff0c;能自主完成给定任务的计算机程序。 大模型拥有接受输入&#xff0c;分析推理&#xff0c;继而…

k8s备份恢复(velero)

velero简介 velero官网&#xff1a; https://velero.io/ velero-github&#xff1a; https://github.com/vmware-tanzu/velero velero的特性 备份可以按集群资源的子集&#xff0c;按命名空间、资源类型标签选择器进行过滤&#xff0c;从而为备份和恢复的内容提供高度的灵活…

【Linux】【Jenkins】后端maven项目打包教程-Linux版

本次安装版本&#xff1a;2.4 jenkins详细安装教程1、安装git环境2、安装mavne环境2.1 下载依赖2.2、解压、赋权2.2、配置环境变量2.3、验证安装 3、jenkins-插件下载3.1、进入jenkins-->系统管理3.2、进入系统管理-->插件管理3.3、下载两个插件&#xff08;如果之前下载…

创建GitHub仓库和Git更换远程仓库

文章为个人笔记&#xff0c;详情请看reference 创建 GitHub 创建好账号点击自己头像&#xff0c;出现下拉菜单&#xff0c;点击Your profile 创建成功如下 下载Git 绑定用户 设置ssh-key ssh-keygen -t rsa -C “xxxxxx163.com 之后一直en回车 C:\Users\Y\ .ssh id_rsa…

数据不裸奔:如何确保AI分析顾客数据时的隐私保护

在这个信息爆炸的时代&#xff0c;数据已成为最宝贵的资源之一。人工智能&#xff08;AI&#xff09;技术的发展&#xff0c;使得我们能够从海量数据中提取有价值的信息&#xff0c;为商业决策提供支持。然而&#xff0c;随着AI在数据分析领域的广泛应用&#xff0c;顾客隐私保…

Leetcode 1857. 有向图中最大颜色值

1.题目基本信息 1.1.题目描述 给你一个 有向图 &#xff0c;它含有 n 个节点和 m 条边。节点编号从 0 到 n – 1 。 给你一个字符串 colors &#xff0c;其中 colors[i] 是小写英文字母&#xff0c;表示图中第 i 个节点的 颜色 &#xff08;下标从 0 开始&#xff09;。同时…

免费版视频压缩软件:让视频处理更便捷

现在不少人已经习惯通过视频来记录生活、传播信息和进行娱乐的重要方式。但是由于设备大家现在录制的文件都会比较大&#xff0c;这时候就比较需要一些缩小视频的工具了。今天我们一起来探讨视频压缩软件免费版来为我们带来的生动世界。 1.Foxit视频压缩大师 链接直达&#x…

《深度学习》【项目】自然语言处理——情感分析 <上>

目录 一、项目介绍 1、项目任务 2、评论信息内容 3、待思考问题 1&#xff09;目标 2&#xff09;输入字词格式 3&#xff09;每一次传入的词/字的个数是否就是评论的长度 4&#xff09;一条评论如果超过32个词/字怎么处理&#xff1f; 5&#xff09;一条评论如果…

[每周一更]-(第119期):“BP”大揭秘:生物学与金融学中的微小单位竟有如此大不同!

最近&#xff08;2024.09.29&#xff09;央行要把存量房贷在LPR&#xff08;贷款市场报价利率&#xff09;基础上&#xff0c;降低30BP&#xff0c;刚好基因行业内&#xff0c;也有bp的概念&#xff0c;通过发音无法区分&#xff0c;以下就讲解下生物学的bp和金融学的BP的概念的…

【汇编语言】寄存器(内存访问)(三)—— 字的传送

文章目录 前言1. 字的传送2. 问题一3. 问题一的分析与解答4. 问题二5. 问题二的分析与解答结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言…

Linuxtop命令查看CPU、内存使用率、解释

1. top 命令 top 是最常用的实时监控工具之一&#xff0c;可以显示 CPU 的总利用率以及各个进程的 CPU 使用情况。在Linux命令行直接输入top即可查看动态原始数据 top 在 top 命令的输出中&#xff0c;最上面的一行会显示 CPU 的使用情况&#xff1a; us&#xff08;User&a…

day01-Qt5入门

day01-Qt5入门 1.下载Qtcreate 官网地址&#xff1a;http://qt-project.org/downloads 2.配置环境变量 将类似于 D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin 的目录添加到环境变量中 3.创建一个新项目 输入自己的项目名称&#xff0c;后面默认下一部 4.运行第一个项目 在窗口…

CentOS 7 yum失效的解决办法

文章目录 一、CentOS 7停止维护导致yum失效的解决办法解决方案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、CentOS 7停止维护导致yum失效的解决办法 020 年&#xff0c;CentOS 项目与红帽联合宣布将全部投资转向 CentOS Stream&#xff0c;这是…