初识RabbitMQ

news2025/1/26 5:42:07

大家好我是苏麟今天带来rabbitmq.

RabbitMQ

RabbitMQ官网 : RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ

初识MQ

同步和异步通讯

微服务间通讯有同步和异步两种方式:

同步通讯:就像打电话,需要实时响应。

异步通讯:就像发邮件,不需要马上回复。

两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与 多个人收发邮件,但是往往响应会有延迟。

同步通讯

我们之前学习的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题

总结:

同步调用的优点:

  • 时效性较强,可以立即得到结果

同步调用的问题:

  • 耦合度高
  • 性能和吞吐能力下降
  • 有额外的资源消耗
  • 有级联失败问题

异步通讯

异步调用则可以避免上述问题:

我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响 应的库存并准备发货。

在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件 (event),事件中带上订单id。 订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务 即可。

为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布 者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。

Broker 是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线 就像协议一样,让服务间的通讯变得标准和可控。

好处:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速
  • 故障隔离:服务没有直接调用,不存在级联失败问题
  • 调用间没有阻塞,不会造成无效的资源占用 耦合度极低,每个服务都可以灵活插拔,可替换
  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

缺点:

  • 架构复杂了,业务没有明显的流程线,不好管理
  • 需要依赖于Broker的可靠、安全、性能

好在现在开源软件或云平台上 Broker 的软件是非常成熟的,比较常见的一种就是我们今天要学习的MQ 技术。

技术对比:

MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的 Broker。

比较常见的MQ实现:

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

 几种常见MQ的对比:

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

快速入门

安装RabbitMQ

安装 : RabbitMQ部署指南_踏遍三十六岸的博客-CSDN博客

MQ的基本结构:

RabbitMQ中的一些角色:

  • publisher:生产者
  • consumer:消费者
  • exchange个:交换机,负责消息路由
  • queue:队列,存储消息
  • virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

RabbitMQ消息模型

RabbitMQ官方提供了5个不同的Demo示例,对应了不同的消息模型:

创建Demo工程

结构如下:

包括三部分:

  •  mq-demo:父工程,管理项目依赖 springboot工程
  • publisher:消息的发送者
  • consumer:消息的消费者

 引入依赖

        <dependency>
            <groupId>com.github.luues</groupId>
            <artifactId>spring-boot-starter-rabbitmq</artifactId>
            <version>1.3.0.5.RELEASE</version>
        </dependency>

入门案例

简单队列模式的模型图:

官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:

  • publisher:消息发布者,将消息发送到队列
  • queue queue:消息队列,负责接受并缓存消息
  • consumer:订阅队列,处理队列中的消息

publisher实现

思路:

  • 建立连接
  • 创建Channel
  • 声明队列
  • 发送消息
  • 关闭连接和channel
package com.sl;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;

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

public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
// 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.75.128");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("root");
        factory.setPassword("root");
// 1.2.建立连接
        Connection connection = factory.newConnection();
// 2.创建通道Channel
        Channel channel = connection.createChannel();
// 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);
// 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");
// 5.关闭通道和连接
        channel.close();
        connection.close();
    }
}

consumer实现

代码思路:

  • 建立连接
  • 创建Channel
  • 声明队列
  • 订阅消息
package com.sl;

import com.rabbitmq.client.*;

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

public class ConsumerTest {
    public static void main(String[] args) throws IOException, TimeoutException {
// 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.75.128");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("root");
        factory.setPassword("root");
// 1.2.建立连接
        Connection connection = factory.newConnection();
// 2.创建通道Channel
        Channel channel = connection.createChannel();
// 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);
// 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[]
                                               body) throws IOException {
// 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

总结

基本消息队列的消息发送流程:

  • 1. 建立connection
  • 2. 创建channel
  • 3. 利用channel声明队列
  • 4. 利用channel向队列发送消息

基本消息队列的消息接收流程:

  • 1. 建立connection
  • 2. 创建channel
  • 3. 利用channel声明队列
  • 4. 定义consumer的消费行为handleDelivery()
  • 5. 利用channel将消费者与队列绑定

下阶段 : Spring AMQP-CSDN博客

这期就到这里下期见 !

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

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

相关文章

Illustrator 2022 for mac (AI 2022中文版)

Illustrator 软件是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。作为一款非常好的矢量图形处理工具&#xff0c;该软件主要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等&#xff0c;也可以为线稿提供较高的精度和控制&#xf…

CCF CSP认证 历年题目自练Day35

题目一 试题编号&#xff1a; 202305-1 试题名称&#xff1a; 重复局面 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题…

数学建模——最优连接(基于最小支撑树)

一、概念 1、图的生成树 由图G(V,E)的生成子图G1(V,E1)(E1是E的子集&#xff09;是一棵树&#xff0c;则称该树为图G的生成树&#xff08;支撑树&#xff09;&#xff0c;简称G的树。图G有支撑树的充分必要条件为图G连通。 2、最小生成树问题 连通图G(V,E)&#xff0c;每条边…

Linux系统管理:虚拟机OpenEuler安装

目录 一、理论 1.OpenEuler 二、实验 1.虚拟机OpenEuler安装准备阶段 2.安装OpenEuler 3.进入系统 一、理论 1.OpenEuler &#xff08;1&#xff09;简介 欧拉&#xff08;Euler&#xff09;是数字基础设施的开源操作系统&#xff0c;可广泛部署于服务器、云计算、边缘…

一款简单漂亮的WPF UI - AduSkin

前言 经常会有同学会问&#xff0c;有没有好看简单的WPF UI库推荐的。今天就给大家推荐一款简单漂亮的WPF UI&#xff0c;融合多个开源框架组件&#xff1a;AduSkin。 WPF是什么&#xff1f; WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windo…

[Machine Learning][Part 6]Cost Function代价函数和梯度正则化

目录 拟合 欠拟合 过拟合 正确的拟合 解决过拟合的方法&#xff1a;正则化 线性回归模型和逻辑回归模型都存在欠拟合和过拟合的情况。 拟合 来自百度的解释&#xff1a; 数据拟合又称曲线拟合&#xff0c;俗称拉曲线&#xff0c;是一种把现有数据透过数学方法来代入一条…

MySQL-逻辑架构

MySQL-逻辑架构 1.逻辑架构剖析 1.1服务器处理客户端请求 MySQL属于典型的C/S架构&#xff0c;客户端进程发送请求&#xff0c;服务端进程处理请求。处理的基本流程如下。 MySQL的逻辑架构如下&#xff1a; Connectors&#xff1a;与服务端程序连接的程序。 Manager Servic…

Unity之ShaderGraph如何实现卡通效果

前言 今天我们来实现一下最常见的卡通效果。 效果如下&#xff1a; 关键节点 Remap&#xff1a;基于输入 In 值在输入In Min Max的 x 和 y 分量之间的线性插值&#xff0c;返回输入Out Min Max的 x 和 y 分量之间的值。 SampleGradient&#xff1a;在给定Time输入的情况下…

论坛介绍 | COSCon'23 云计算(C)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&am…

信息系统项目管理师第四版学习笔记——组织通用管理

组织通用管理是项目管理的关键前提和基础&#xff0c;它为项目管理提供思想路线和基本原则与方法&#xff0c;项目管理则是通用管理方法在特定场景下的具体表现。 人力资源管理 人力资源管理基础 人力资源管理的广义目标是充分利用组织中的人员使组织的各项工作效率水平达到…

竞赛选题 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

互联网Java工程师面试题·Java 总结篇·第七弹

目录 68、Java 中如何实现序列化&#xff0c;有什么意义&#xff1f; 69、Java 中有几种类型的流&#xff1f; 70、写一个方法&#xff0c;输入一个文件名和一个字符串&#xff0c;统计这个字符串在这个文件中出现的次数。 71、如何用 Java 代码列出一个目录下所有的文件&a…

chatglm2微调—Lora

1.使用ChatGLM-Efficient-Tuning框架 官网下载https://github.com/hiyouga/ChatGLM-Efficient-Tuning 或者国内镜像https://gitee.com/mirrors/chatglm-efficient-tuning 推荐一些写的不错的链接以及官网readme ChatGLM2-6B微调 - 掘金 (juejin.cn) 基于 PEFT 的高效 Chat…

78.C++ STL set/multiset容器

目录 1.什么是set和multiset 2.set和multiset的区别&#xff1a; 3.树的简单知识&#xff1a; 4.构造函数和赋值函数 5.set大小和交换 6.set插入和删除 7.set查找和统计 1.什么是set和multiset set 和 multiset 是 C 标准库中的关联容器&#xff0c;底层结构是用二叉树实…

算法专题:双指针

目录 题目1&#xff1a;移动零 题目2&#xff1a;复写零 题目3&#xff1a;快乐数 题目4&#xff1a;最多水的容器 题目5&#xff1a;有效三角形的个数 题目6&#xff1a;两数之和为s 题目1&#xff1a;移动零 给定一个数组nums&#xff0c;编写一个函数将所有的0移动到数…

java学生通讯录管理系统

设计要求 本课程设计&#xff0c;涉及输入输出、GUI设计、数据库操作等本课程重要概念和编程技能&#xff0c;全面巩固和加深学生对java程序设计的相关概念的理解&#xff0c;全面强化java编程技能&#xff0c;培养学生综合运用所学知识和技能分析问题和解决问题的能力。培养学…

消息队列-链表动态申请

一、链表的介绍 链表是一种常用的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。 C语言消息队列链表是一种使用链表实现的队列模块&#xff0c;可以用于在程序中实现消息队列的功能。C语言消息队列链表是一种自定义的数据结构&…

热门影视APP系统源码 可二开 后端+app+搭建教程

影视APP源码绿豆二开版 后端app搭建教程都在压缩包里&#xff0c;搭建步骤和绿豆一样 安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 安装环境 Nginx 1.20.2 MySQL5.6-5.7 php7.0-7.…

C++特性——引用与指针详解

文章目录 引用1. 引用的作用1.1 引用可以做函数参数&#xff1a;1.2 引用做函数返回值&#xff1a; 2 常引用3 引用和指针3.1 引用和指针在语法层面和底层的异同3.1 引用和指针的不同 引用 简单来说&#xff0c;引用就是给一个变量起一个别名。例如&#xff1a; int a 1; in…

【数之道 05】走进神经网络模型、机器学习的世界

神经网络 神经网络&#xff08;ANN&#xff09;神经网络基础激活函数 神经网络如何通过训练提高预测准确度逆向参数调整法 &#xff08;BackPropagation&#xff09;梯度下降法链式法则增加一层 b站视频连接 神经网络&#xff08;ANN&#xff09; 最简单的例子&#xff0c;视…