RabbitMQ入门篇(1):初识MQ

大家好,我是加洛斯,是一名全栈工程师👨‍💻,这里是我的知识笔记与分享,旨在把复杂的东西讲明白。如果发现有误🔍,万分欢迎你帮我指出来!废话不多说,正文开始 👇

一、消息队列中间件

1.1 什么是消息队列中间件?

消息队列中间件Message Queue Middleware,简称MOM)是一种基于消息传递的分布式系统基础软件 ,它充当应用程序之间的"消息邮局 "或"异步通信桥梁",允许应用通过发送和接收消息进行通信,而无需直接建立连接或同时在线。

主流消息队列中间件产品

产品 开发语言 核心协议 适用场景 特点
RabbitMQ Erlang AMQP 企业级应用、复杂路由 功能丰富、生态成熟、延迟低
Apache Kafka Scala/Java 自定义协议 大数据流处理、日志收集 高吞吐、持久化、分区机制
RocketMQ Java 自定义协议 金融级应用、高可靠 阿里开源、事务消息、延迟消息
ActiveMQ Java JMS/AMQP 传统企业集成 老牌产品、支持 JMS 规范
Pulsar Java 自定义协议 云原生、多租户 存算分离、水平扩展强
ZeroMQ C++ 自定义协议 高性能嵌入式 无 Broker、库级别实现

1.2 什么是消息队列?

消息队列Message Queue,简称MQ)是一种异步的通信机制 ,它让应用程序能够通过发送和接收消息 来交换数据,而无需直接连接或同时运行。简单来说,它是一个暂存消息的"缓冲区" ,遵循先进先出(FIFO) 的原则。

二、同步调用与异步调用

2.1 同步流程(Synchronous)

定义 :调用方发送请求后,必须阻塞 ,等待被调用方处理完成并返回结果 ,才能继续执行后续代码。

举个例子来说就是打电话:

  • 你拨号后必须等待对方接听
  • 你说完一句话要等对方回应
  • 通话期间双方必须同时在线
  • 任何一方挂断,通信立即结束

2.2 异步流程(Asynchronous)

定义 :调用方发送请求后立即返回 ,无需等待被调用方处理,被调用方完成后通过回调、通知或轮询方式告知结果。

举个例子来说就是发微信

  • 你发送消息后可以做其他事
  • 对方不一定立即查看
  • 对方回复时你会收到通知
  • 双方无需同时在线

2.3 优缺点对比

优缺点 同步流程 异步流程
响应时间 慢(累加所有服务耗时) 快(仅主逻辑耗时)
系统耦合 高(直接依赖下游服务) 低(通过队列解耦)
容错性 差(下游故障影响上游) 强(故障隔离,可重试)
资源利用 低(线程阻塞等待) 高(线程立即释放)
数据一致性 强(实时确认结果) 最终一致性(短暂延迟)
编程复杂度 简单(线性思维) 复杂(需处理回调、幂等)
适用场景 查询、强一致性事务 通知、耗时操作、削峰

三、为什么要用到消息队列中间件?

在上面我们学到了同步调用与异步调用,我们也列举了优缺点,那么我们知道消息队列是一种异步通信机制,我们来看下面这张图,这是一个非常典型的一个支付流程。

在上述支付流程当中有三步,如果我们使用同步调用机制,那么每执行一步就要等待一次返回结果,然后根据返回结果选择是否执行下一步。

如果这时候突然有两个新的需求,那么你不仅要写新需求的代码,还要更改之前的代码以适配新的需求,并且如果后续还是有新的需求,使用同步调用所完成的时间只会越来越长。

四、什么是RabbitMQ?

RabbitMQ是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP),用于在分布式系统中存储和转发消息。

AMQP(Advanced Message Queuing Protocol,高级消息队列协议) 是一个开放标准的应用层协议 ,专门用于面向消息中间件。它定义了应用程序之间如何通过消息队列进行可靠、安全、异步的通信,而不受编程语言、操作系统或技术平台的限制

五、RabbitMQ整体架构以及核心概念

六、RabbitMQ管理页面展示

在安装完rabbitmq后进入到控制页面,类似于minio的控制页面,如下图所示

给各位翻译一下再看看

其中最主要的就是如下这几个,在第五条中我们简单的介绍了MQ中存在的几类概念。

我们来看看队列界面

翻译一下,很简单,下面有一个创建队列,我们先创建两个队列

七、入门程序

我们简单的写一个案例,不涉及到交换机,就是从生产者到队列再到消费者

7.1引入依赖与配置

我们需要的是Spring AMQP

Spring AMQP是一个基于AMQP协议的消息中间件框架,它提供了一个简单的API来发送和接收异步、可靠的消息。它是Spring框架的一部分,可以与Spring Boot和其他Spring项目一起使用。Spring AMQP支持多种消息协议,包括RabbitMQApache ActiveMQQpid等。它提供了一个高级的消息模型,包括消息确认、事务和消息监听器等功能,使得开发者可以轻松地编写可靠的消息应用程序。Spring AMQP还提供了一些高级特性,如消息转换器、消息路由、消息过滤和消息拦截等。

pom 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

然后在applicant.yml中配置mq地址与用户

xml 复制代码
spring:
  application:
      name: learnMQ
  rabbitmq:
    host: ip地址
    port: 5672(如果是云服务器别忘了放行)
    virtual-host: /(你自己的)
    username: admin(你自己的)
    password: admin(你自己的)

7.2创建测试类发送消息到队列

阅读如下代码,这是一个生产者发送消息的

RabbitTemplate 是 Spring AMQP 框架中用于操作 RabbitMQ 的核心类,它封装了与 RabbitMQ 交互的底层细节,提供了简洁的 API 来发送和接收消息。

java 复制代码
package com.example;

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class SpringAmqpTest {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSimpleQueue() {
        String queueName = "queue.a";//消息
        String message = "你好,mq1";
        rabbitTemplate.convertAndSend(queueName, message);
    }
}

7.3 创建消费类接收队列中的消息

首先我们在创建一个模块模拟两个微服务之间的通讯,然后创建代码

编写消费者代码

java 复制代码
package com.example.listeners;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class MqListener {
    @RabbitListener(queues = "queue.a")
    public void listensimpleQueue(String msg){
        System.out.println("消费者收到了queue.a的消息:【" + msg + "】");
    }
}

7.4 测试

首先我们先运行消费者的代码,然后运行生产者的测试程序,在控制台就能看到以下打印信息

至此一个简单的MQ概念就算是学习完毕了。

相关推荐
bai_lan_ya1 小时前
makefile通用解析
java·运维·数据库
苏三说技术1 小时前
Nacos 和 Apollo,哪个更好?
后端
小兔崽子去哪了2 小时前
百度智能云模型接入
java·openai
独自破碎E2 小时前
BISHI73 【模板】欧拉函数计算Ⅰ ‖ 朴素求值:试除法
java·开发语言
独自破碎E2 小时前
BISHI66 子数列求积
android·java·开发语言
爱学习的小可爱卢2 小时前
JavaSE基础-Java String不可变性深度解析
java·javase
君爱学习2 小时前
Spring Boot JWT Token 认证
java
程序员清风2 小时前
2026年必学:Vibe Coding几个实用技巧,老手都在偷偷用!
java·后端·面试
夕除2 小时前
js--24
java