初始MQ(安装使用RabbitMQ,了解交换机)

news2024/11/26 14:43:27

目录

  • 初识MQ
    • 一:同步调用
    • 二:异步调用
    • 三:技术选型
  • RabbitMQ
    • 一:安装部署
    • 二:快速入门
    • 三:数据隔离
  • java客户端
    • 一:快速入门
    • 二:workqueues
    • 三:Fanout交换机
    • 四:Direct交换机
    • 五:Topic交换机
    • 六:声明队列和交换机
      • 1:基于bean声明
      • 2:基于注解
    • 七:消息转换器

初识MQ

一:同步调用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同步调用,以支付服务为例,支付服务首先就要扣减用户的余额,等待用户余额扣减成功才会更改支付状态,这里必须使用同步,因为只有用户金额扣减完毕才能更改支付状态,支付状态要等待扣减余额成功的消息,所以要同步调用;

而后续的更改订单状态,通知服务,积分服务,不是和支付强相关的,如果同步执行的话因为串行执行所以性能下将,然后增加了代码的耦合性拓展性差,还有就是服务多了,如果有服务出现了问题而又是同步调用很可能出现雪崩,而且就算是使用了服务保护策略如熔断,那就会出现数据的不一致;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二:异步调用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异步调用的三个角色:1:消息发送者:投递消息,也就是调用者

2:消息接收者:接收消息,也就是原来的被调用的服务

3:消息代理:管理暂存转发消息;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异步调用会把消息消息直接发送到消息代理,就不用管了,直接就解除了耦合,拓展性强;

即使消息接收者出现了问题也不会影响到消息发送者,而且即使挂了,消息也会在消息代理存储,直到服务健康,还是会把消息发送出去进行处理,实现了故障隔离。

而且消息发送者只是发布了通知,无需等待回复,所以性能好;

对于高并发的请求,我们可以先将消息缓存到消息代理中,等待请求小的时候慢慢处理,防止对服务器造成巨大的压力;

实现流量的削峰填谷;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异步调用的问题:不能立即获取结果时效性差,不确定下游业务是否执行成功;业务的安全依靠消息代理的可靠性;

如何选择:对时效性要求很高的可以选择使用同步调用,对时效性要求不高并且对性能要求较高的可以使用异步调用;

三:技术选型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RabbitMQ

一:安装部署

使用docker安装:

docker run \
 -e RABBITMQ_DEFAULT_USER=itheima \
 -e RABBITMQ_DEFAULT_PASS=123321 \
 -v mq-plugins:/plugins \
 --name mq \
 --hostname mq \
 -p 15672:15672 \
 -p 5672:5672 \
 --network hm-net\
 -d \
 rabbitmq:3.8-management

然后访问15672是rabbitMQ的控制台端口,5672是消息接发

然后就可以访问15672端口控制台

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

rabbitMQ中有几个角色:消息的发送者,消息的接收者,消息队列,消息发送者发送消息不是直接到达消息队列,而是通过exchange,交换机,来将消息路由到队列,再有队列转发给接收者;然后我们一个消息中间件可能要多个项目使用,为了将不同的项目隔离开,就像是数据库的database一样,会单独整出来一个虚拟主机;

二:快速入门

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

交换机只会路由消息不能存储消息;交换机必须绑定对应的队列,才会发送消息给绑定的队列;

三:数据隔离

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里添加用户就可以了

java客户端

一:快速入门

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

publisher是发消息:

如何发消息:

1:引入依赖:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2:配置yaml文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

spring:
  rabbitmq:
    host: 117.72.106.51 # 你的虚拟机IP
    port: 5672 # 端口
    virtual-host: /hmall # 虚拟主机
    username: hmall # 用户名
    password: 123 # 密码

3:创建测试类(注意测试类要和main在相同包下)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@SpringBootTest
class PublisherApplicationTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Test
    void rabbitPublish() {
        String queueName="simple.queue";
        String msg="hello,springAMQP";
        rabbitTemplate.convertAndSend(queueName,msg);
    }
}

4:接收消息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@Slf4j
@Component
public class SpringRabbitListener  {
    @RabbitListener(queues = "simple.queue")
    public void Lisen(String msg){
        log.info(msg);
    }
}

二:workqueues

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

workqueue任务模型:多个消费者绑定同一个队列;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过验证我们发现,50条消息是均匀分配的,提前匹配好然后均分好,不论哪个消费者处理的是快还是慢都是均分:

多个消费者的好处:提高消息处理的速度,有点类似于负载均衡;但是均分的话,有的处理的快的消费者的接收能力会被限制

一般我们在项目中只需要定义一个消费者,因为我们部署了集群会有多个实例,每个实例都会一个消费者,从而达到了多消费者处理消息的模式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过prefetch,每个消费者每次只能获取一条消息,防止提前平均分配浪费性能,这个有点像抢夺消息;

listener:
  direct:
    prefetch: 1 #一次只会分配一条消息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三:Fanout交换机

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

交换机的作用:我们之前直接使用队列进行转发,一个消息只会被一个消费者处理,而我们的服务调用,一个消息可能有多个服务都需要,所以我们引入了交换机,交换机可以将消息转发的多个队列,队列在发送给消费者,相当于一个消息发出复制了多份,而不是只能被一个消费者使用;

交换机有不同的类型如fanout就是广播类型,只要发送消息给fanout交换机他就会吧消息发送给所有的队列

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们之前只用了converandsend直接把消息发到了队列中这里要发送到交换机需要中间加上一个参数null;

四:Direct交换机

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

direct交换机发送消息的方式是定向的:我们的交换机在绑定队列的时候要指定bingdingkey,然后我们在java中向交换机发送的时候要带上bingdingkey,只发送给对应bindingkey的队列;那如果设置的bindingkey一致就会发送给不同的队列;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五:Topic交换机

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

topic的bindingkey通过通配符来匹配更编辑,而且拓展性更强

六:声明队列和交换机

1:基于bean声明

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@Configuration
public class FanoutConfiguration {
    @Bean
    public Queue queueBuilder1(){
        return new Queue("fanout.queue1");
    }
    @Bean
    public Queue queueBuilder2(){
        return new Queue("fanout.queue2");
    }
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("hmall.fanout");
    }
    @Bean
    public Binding binding1(){
        return BindingBuilder.bind(queueBuilder1()).to(fanoutExchange());
    }
    @Bean
    public Binding binding2(){
        return BindingBuilder.bind(queueBuilder2()).to(fanoutExchange());
    }
}

通过bean来声明,队列返回的类型是Queue,交换机要先确定交换机的类型比如fanout交换机FanoutExchange,然后绑定队列与交换机Binding,使用BindingBuilder的build-to 方法;

2:基于注解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue1"),
        exchange = @Exchange(name = "hmall.direct",type = ExchangeTypes.DIRECT),
        key = {"blue","red"}
))
public void Listen3(String msg){
    log.info("dirct.queue1"+msg);
}
@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "direct.queue2"),
        exchange = @Exchange(name = "hmall.direct",type = ExchangeTypes.DIRECT),
        key = {"yellow","red"}
))
public void Listen4(String msg){
    log.info("dirct.queue2"+msg);
}

七:消息转换器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将复杂的对象发送到队列,rabbit默认会使用java自带的序列话器,序列化出来的对象不便于我们查看,我们可以将默认的序列化器改为json序列化,需要引入jackson的依赖,然后通过bean注入到ioc中;

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

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

相关文章

[C++11] 类中新特性的添加

默认的移动构造和移动赋值 在 C11 之前&#xff0c;编译器会为每个类自动生成默认的构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等函数&#xff0c;以实现对象的创建、销毁和拷贝操作。但拷贝操作会复制整个对象的数据&#xff0c;效率低&#xff0c;尤其是在处理大对象…

emr上使用sparkrunner运行beam数据流水线

参考资料 https://time.geekbang.org/column/intro/167?tabcatalog Apache Beam和其他开源项目不太一样&#xff0c;它并不是一个数据处理平台&#xff0c;本身也无法对数据进行处理。Beam所提供的是一个统一的编程模型思想&#xff0c;而我们可以通过这个统一出来的接口来编…

github高分项目 WGCLOUD - 运维实时管理工具

GitHub - tianshiyeben/wgcloud: Linux运维监控工具&#xff0c;支持系统硬件信息&#xff0c;内存&#xff0c;CPU&#xff0c;温度&#xff0c;磁盘空间及IO&#xff0c;硬盘smart&#xff0c;GPU&#xff0c;防火墙&#xff0c;网络流量速率等监控&#xff0c;服务接口监测&…

MyBatisPlus 用法详解

文章目录 一、快速入门1.1 引入依赖&#xff1a;1.2 定义 Mappper&#xff1a;1.3 使用演示&#xff1a;1.4 常见注解&#xff1a;1.4.1 TableName:1.4.2 TableId&#xff1a;1.4.3 TableField&#xff1a; 1.5 常见配置&#xff1a; 二、核心功能2.1 条件构造器&#xff1a;2.…

Python小游戏23——捕鱼达人

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; 【bash】 pip install pygame 运行效果展示 接下来是示例代码&#xff1a; 【python】 import pygame import random # 初始化Pygame pygame.init() # 屏幕尺寸 SCREEN…

库打包工具 rollup

库打包工具 rollup 摘要 **概念&#xff1a;**rollup是一个模块化的打包工具 注&#xff1a;实际应用中&#xff0c;rollup更多是一个库打包工具 与Webpack的区别&#xff1a; 文件处理&#xff1a; rollup 更多专注于 JS 代码&#xff0c;并针对 ES Module 进行打包webpa…

基于SSM+VUE小学生素质成长记录平台JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

【架构设计常见技术】

EJB EJB是服务器端的组件模型&#xff0c;使开发者能够构建可扩展、分布式的业务逻辑组件。这些组件运行在EJB容器中&#xff0c;EJB将各功能模块封装成独立的组件&#xff0c;能够被不同的客户端应用程序调用&#xff0c;简化开发过程&#xff0c;支持分布式应用开发。 IOC …

优选算法 - 1 ( 双指针 移动窗口 8000 字详解 )

一&#xff1a;双指针 1.1 移动零 题目链接&#xff1a;283.移动零 class Solution {public void moveZeroes(int[] nums) {for(int cur 0, dest -1 ; cur < nums.length ; cur){if(nums[cur] 0){}else{dest; // dest 先向后移动⼀位int tmp nums[cur];nums[cur] num…

鸿蒙操作系统是什么?与安卓系统有什么区别?

鸿蒙操作系统 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款基于微内核的面向全场景的分布式操作系统。 发展历程&#xff1a; 早期规划&#xff1a;华为从2012 年开始规划自有操作系统&#xff0c;并在芬兰赫尔辛基设立智能手机研发中心&#xff0c;招…

现场工程师日记-MSYS2迅速部署PostgreSQL主从备份数据库

文章目录 一、概要二、整体架构流程1. 安装 MSYS2 环境2. 安装postgresql 三、技术名词解释1.MSYS22.postgresql 四、技术细节1. 创建主数据库2.添加从数据库复制权限3. 按需修改参数&#xff08;1&#xff09;WAL保留空间&#xff08;2&#xff09;监听地址 4. 启动主服务器5.…

第二届计算机网络技术与电子信息工程国际学术会议(CNTEIE 2024,12月6-8日)

第二届计算机网络技术与电子信息工程国际学术会议&#xff08;CNTEIE 2024&#xff09; 2024 2nd International Conference on Computer Network Technology and Electronic and Information Engineering 重要信息 会议官网&#xff1a;www.cnteie.org 2024 2nd Internation…

Git 入门篇(一)

前言 操作系统&#xff1a;win11 64位 与gitee搭配使用 Git 入门篇&#xff08;一&#xff09; Git 入门篇&#xff08;二&#xff09; Git 入门篇&#xff08;三&#xff09; 目录 git下载、安装与配置 下载 安装 配置 git下载、安装与配置 下载 官网&#xff1a;git-…

WPS文档中的“等线”如何删除

如何删除“等线”占用的行如何删除表格之间的空行WPS文档中的“等线”是什么如果删除脚注文本占用的行 如下这种&#xff0c;在文档中添加了表格和脚注&#xff0c;发现上下表格之间有多行空行&#xff0c;鼠标选中&#xff0c;显示是“等线”&#xff0c;那么如何去除等线占用…

题目讲解15 合并两个排序的链表

原题链接&#xff1a; 合并两个排序的链表_牛客题霸_牛客网 思路分析&#xff1a; 第一步&#xff1a;写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…

计算机网络基本概念总结

IP地址 概念 使网络中的设备都有唯一的地址标识&#xff0c;用于表示其在网络中的位置。 格式 IP地址是一个32位的二进制数&#xff0c;通常被分割为4个8位二进制数&#xff08;也就是4个字节&#xff09;&#xff0c;如&#xff1a;01100100.00001000.00001010.00000110。通常…

Pandas | 特征列大量数据异常需要填充数据时注意事项

问题描述 一组数据如下&#xff1a; df.isnull().sum()城市 0 名称 0 星级 1529 评分 0 价格 1 销量 1 省/市/区 0 坐标 0 简介 41 是否免费 0 具体地址 3 dtype: int64df[星级]0…

Science Robotics 综述揭示演化研究新范式,从机器人复活远古生物!

在地球46亿年的漫长历史长河中&#xff0c;生命的演化过程充满着未解之谜。如何从零散的化石证据中还原古生物的真实面貌&#xff1f;如何理解关键演化节点的具体过程&#xff1f;10月23日&#xff0c;Science Robotics发表重磅综述&#xff0c;首次系统性提出"古生物启发…

[编译报错]ImportError: No module named _sqlite3解决办法

1. 问题描述&#xff1a; 在使用python进行代码编译时&#xff0c;提示下面报错&#xff1a; "/home/bspuser/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py", line 18, in <module>import sqlite3File "/usr/local/lib/python2.7/sqlite3/_…

EasyExcel的AbstractColumnWidthStyleStrategy注入CellStyle不生效

设置背景色 CellStyle style workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex()); // 是设置前景色不是背景色style.setFillPattern(FillPatternType.SOLID_FOREGROUND)EasyExcel.writerTable(0).head(Head1.class).registerWriteHandl…