RabbitMQ 核心功能详解

news2025/1/16 21:00:52

引言

在现代分布式系统中,消息队列已经成为一种不可或缺的组件。它不仅能够实现应用之间的解耦,还能提高系统的灵活性和可扩展性。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 并指定了一个回调函数来处理收到的消息。每当有新消息到达时,这个回调就会被调用,并打印出消息内容。


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

香港举办AIHCIR 2024国际学术会议,领先人工智能、人机交互和机器人技术

第三届人工智能、人机交互和机器人国际学术会议 &#xff08;AIHCIR 2024&#xff09;将于2024年11月在中国香港举行&#xff0c;聚焦AI、人机交互与机器人领域&#xff0c;邀请知名学者演讲&#xff0c;促进学术交流。论文经评审后提交EI检索&#xff0c;投稿需全英文&#xf…

图解Redis 04 | Set数据类型的原理及应用场景

介绍 Redis 的 Set 类型是一个不允许重复元素的集合&#xff0c;元素存储的顺序不按照插入的顺序&#xff0c;因此属于无序集合。一个 Set 最多可以存储 2^32 - 1 个元素&#xff0c;这与数学中的集合概念类似。Set 类型不仅支持增、删、改、查等操作&#xff0c;还支持多个Se…

微软的 Drasi:一种轻量级的事件驱动编程方法

微软的开源数据变化处理平台有望提供一种全新的方式来构建和管理可产生持续事件流的云应用程序。 Microsoft Azure 孵化团队是微软超大规模云中比较有趣的组成部分之一。它介于传统软件开发团队和研究组织之间&#xff0c;致力于构建大规模分布式系统问题的解决方案。 这些解决…

使用拖拽生成活动海报(vue项目)

<template><div class"poster-editor"><div class"toolbar" v-if"edit 1"><div style"text-align: center;font-size: 14px;font-weight: 700;margin-bottom: 10px;">工具栏</div><div class"…

WPF组件的自定义模板和触发器全面解析

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软提供的一个用于构建桌面客户端应用程序的UI框架。其依赖于XAML&#xff08;Extensible Application Markup Language&#xff09;进行用户界面设计&#xff0c;提供了一套强大的控件和组件模型。在WPF开发中&…

C++ 的存储类型与新的 thread_local

1 C 的存储类型 1.1 存储周期&#xff08;Storage duration&#xff09; 存储周期表示一个变量的存储空间持续的时间&#xff0c;它应该与对象的语义生命周期一致&#xff08;或至少不小于对象的语义生命周期&#xff09;。C 98从 C 继承了三种存储周期&#xff0c;分别是静态…

【黑马点评】项目知识点及面经整理

【黑马点评】项目知识点及面经整理 1 短信登录&#xff08;Session&#xff0c;Redis&#xff0c;JWT验证&#xff09;1.1 JWT和Session的区别1.2 Session1.3 Redis1.3.1 基于Redis实现登录验证1.3.2 登录拦截 1.4 JWT1.4.1 JWT的有效验证1.4.2 JWT定义 2 热点数据缓存2.1 缓存…

区块链-智能合约Solidity编程

文章目录 一、ubuntu安装二、FISCO BCOS安装五、 WeBASE安装5.1 WeBASE简介5.2 节点前置服务搭建5.3 调用HelloWorld合约 七、Solidity极简入门7.1. 值类型7.2. 变量数据存储和作用域7.3. 函数7.4 控制流7.5 数组&映射7.6 结构体7.7 修饰符7.8 事件7.9 面向对象7.10 抽象合…

SoC芯片中Clock Gen和Reset Gen的时钟树综合

社区目前已经开设了下面列举的前四大数字后端实战课程&#xff0c;均为直播课&#xff0c;且均是小编本人亲自授课&#xff01;遇到项目问题&#xff0c;都可以远程一对一指导解决具体问题。小编本人是一线12年后端经验的数字后端工程师。想找一线IC后端技术专家亲自带你做后端…

Java Fork-Join框架学习

概述 Fork/Join是Java7提供的一个用于并行执行任务的框架&#xff0c;是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。Fork负责把一个大任务切分为若干并行执行的子任务&#xff0c;Join负责合并这些子任务的执行结果&#xff0…

Ubuntu系衍生版手动修改配置网卡的配置总结

一、Ubuntu系的IP地址配置文件的目录&#xff1a; sudo vim /etc/network/interfaces 二、以DHCP方式配置网卡&#xff1a; 在以上配置文件中添加以下两行&#xff1a; auto enp3s0 iface enp3s0 inet dhcp 三、为网卡配置静态IP地址&#xff1a; 在以上配置文件中添…

实验3,网络地址转换

实验3&#xff1a;网络地址转换 实验目的及要求&#xff1a; 通过实验&#xff0c;掌握NAT技术的工作原理&#xff0c;了解三种不同类型NAT技术的主要作用以及各自的主要应用环境。能够完成静态NAT和复用NAT技术的应用&#xff0c;并熟练掌握NAT技术相关的配置命令。 实验设…

el-date-picker选择时间后标准时间少1小时问题

问题 前端开发中发现Element的时间组件el-date-picker在选择选择部分时间后js对象的标准时间少1小时&#xff0c;如果选择的小时为0&#xff0c;会导致部分转换条件下结果少1天。 比如组件中选择的本地时间为&#xff1a; 1988-08-01 00:00:00 而js对象获取到是标准时间是&am…

ubuntu 安装kali命令补全功能

输入命令时&#xff0c;之前的命令会以阴影显示&#xff0c;按下右键或 Tab 键可以直接补全 安装zsh-autosuggestions sudo apt install zsh-autosuggestions编辑 ~/.zshrc环境变量 if [ -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then. /usr/share/zs…

【从零开始的LeetCode-算法】945. 使数组唯一的最小增量

给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 < i < nums.length 的下标 i&#xff0c;并将 nums[i] 递增 1。 返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。 生成的测试用例保证答案在 32 位整数范围内。 示例 1&#xff1a; 输入&am…

【Hadoop】HDFS基本操作

参考&#xff1a;3.HDFS基本操作_哔哩哔哩_bilibili 创建目录 hadoop fs -mkdir -p /training/qiang查看当前根目录下文件 hadoop fs -ls /hadoop fs -ls /training/目录授权 hadoop fs -chmod -R 777 /training/qm777是最大权限&#xff0c;读写 4、2、1 上传文件 先创…

YZ系列工具之YZ09:VBA_Excel之读心术

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

Python自动化脚本裁剪图片为1:1比例

一、创建输入文件夹&#xff08;in&#xff09;和输出文件夹&#xff08;out&#xff09;&#xff0c;将原始图片放在输入文件夹&#xff08;in&#xff09;里 二、 安装对应的Python库 pip install Pillow 三、编写自动化脚本代码 import os from PIL import Imagedef crop…

Axure RP电商系统商城PC+app+后台买家卖端高保真原型模板及元件库

AxureRP电商商城PCapp后台买家卖端高保真原型模板本套包含三份原型图素材 APP买家端原型简介&#xff1a; 包含了用户中心、会员成长、优惠券、积分、互动社区、运营推广、内容推荐、商品展示、订单流程、订单管理、售后及服务等完整的电商体系功能架构和业务流程。 本模板由…

Spring中ApplicationEvent事件的实现

1&#xff09;简介 Spring Event (接口名为Aplication Event) 观察者设计模式&#xff0c;由事件发起者publisher发布事件&#xff08;指定事件名&#xff09;&#xff0c;事件监听者监听事件&#xff08;指定事件名&#xff09;。 好比&#xff0c; A 说了一句话&#xff0c…