首页 > 其他分享 >RabbitMQ学习笔记(一)

RabbitMQ学习笔记(一)

时间:2023-12-09 18:56:48浏览次数:26  
标签:String void 笔记 学习 交换机 消息 msg RabbitMQ public

安装

1.下载erlang并安装,地址:http://erlang.org
2.下载mq并安装,地址:http://www.rabbitmq.com/download.html
3.安装完成后,管理后台地址:http://localhost:15672,初始账号和密码:guest/guest

优缺点

优点:解耦、削峰、数据分发
缺点:

  • 系统可用性降低;系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响
  • 系统复杂度提高;MQ的加入大大增加了系统的复杂性,以前系统间是同步的远程调用,现在是通过进行异步调用。如何保证MQ的高可用?如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递的顺序性?
  • 一致性问题;A系统处理完业务,通过MQ给BCD三个系统发消息数据,如果B系统,C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性?

对比

ActiveMQ RabbitMQ RocketMQ kafka
开发语言 java erlang java scala
单击吞吐量 万级 万级 十万级 十万级
时效性 ms级 us级 ms级 ms级以内
可用性 高(主从架构) 高(主从架构) 非常高(分布式架构) 非常高(分布式架构)
功能特性 成熟的产品,在很多公司得到应用,有较多的文档;各种协议支持较好 基于erlang开发,所以并发能力很强,性能及其好,延时很低;管理界面丰富,缺点是很难进行二次开发 MQ功能比较完备,扩展性佳 只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。

备注:初学,以下内容涉及的队列和交换机,以及绑定关系都是在管理后台进行的操作

//Spring Boot项目中引入amqp包
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

//配置文件中加入如下配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

一、直接发送消息到队列,不经过交换机

1、简单队列,只有一个消费者

    /**
     * 简单队列
     */
    @Test
    public void testSimpleQueue(){
        String queueName ="simple.queue";
        String message ="testSimpleQueue";
        rabbitTemplate.convertAndSend(queueName,message);
    }

    @RabbitListener(queues = "simple.queue")
    public  void listenSimpleQueue(String msg) {
        System.out.println("消费者收到消息====================="+msg);
    }

2、工作队列,多个消费者

    /**
     * 工作队列
     */
    @Test
    public void testWorkQueue() throws InterruptedException {
        String queueName ="work.queue";
        String message ="testWorkQueue";
        for (int i = 0; i < 50; i++) {
            rabbitTemplate.convertAndSend(queueName,message+i);
            Thread.sleep(20);
        }

    }

    @RabbitListener(queues = "work.queue")
    public  void listenWorkQueue1(String msg) {
        System.out.println("消费者work.queue 1收到消息====================="+msg);
    }

    @RabbitListener(queues = "work.queue")
    public  void listenWorkQueue2(String msg) throws InterruptedException {
        System.out.println("消费者work.queue 2收到消息====================="+msg);
        Thread.sleep(100);
    }

每个消息只会被消费一次,默认情况下消费者轮流消费,可以通过设置spring.rabbitmq.listener.simple.prefetch=1来确保同一时刻最多投递给消费者1条消息,从而避免消息堆积

二、消息经过交换机

交换机的作用是对消息进行路由,但不具备保存消息的能力。

1.Fanout交换机

会将接收到的消息广播到每一个跟其绑定的队列,所以也叫广播模式

举例,交换机和队列进行绑定如下,

    /**
     * fanout交换机
     */
    @Test
    public void testSimpleQueue(){
        String exchangeName ="test.fanout";
        String message ="hello,everyone!";
        rabbitTemplate.convertAndSend(exchangeName,null,message);
    }

    @RabbitListener(queues = "fanout.queue")
    public  void listenFanoutQueue1(String msg) {
        System.out.println("消费者fanout.queue 收到消息====================="+msg);
    }

    @RabbitListener(queues = "fanout.queue1")
    public  void listenFanoutQueue2(String msg) {
        System.out.println("消费者fanout.queue 1收到消息====================="+msg);
    }

结果:
消费者fanout.queue 收到消息=====================hello,everyone!
消费者fanout.queue 1收到消息=====================hello,everyone!

2.Direct交换机

Direct交换机会将接收到的消息根据规则路由到指定的队列,因此称为定向路由。
每一个队列都与交换机设置一个BindingKey;
发布者发送消息时,指定消息的RoutingKey;
交换机将消息路由到BingingKey与消息RoutingKey一致的队列;

举例,交换机与队列的BindingKey如下,

    @Test
    public void testDirectQueue(){
        String exchangeName ="test.direct";
        String message ="hello!";
        rabbitTemplate.convertAndSend(exchangeName,"red",message);
        rabbitTemplate.convertAndSend(exchangeName,"blue",message);
    }

    @RabbitListener(queues = "direct.queue1")
    public  void listenDirectQueue1(String msg) {
        System.out.println("消费者direct.queue1 收到消息====================="+msg);
    }

    @RabbitListener(queues = "direct.queue2")
    public  void listenDirectQueue2(String msg) {
        System.out.println("消费者direct.queue2 收到消息====================="+msg);
    }

结果:
消费者direct.queue1 收到消息=====================hello!
消费者direct.queue2 收到消息=====================hello!
消费者direct.queue1 收到消息=====================hello!

3.Topic交换机

与Direct交换机类似,区别在于RoutingKey可以是多个单词的列表,以.分隔。BindingKey可以使用通配符。#代指0个或多个单词,*代指一个单词(比如routingKey是多个单词,就不匹配)

举例,当交换机与队列的BindingKey如下时,

    @Test
    public void testTopicQueue(){
        String exchangeName ="test.topic";
        rabbitTemplate.convertAndSend(exchangeName,"japan.news","日本红色预警!");
        rabbitTemplate.convertAndSend(exchangeName,"china.news","中国蓝色预警!");
        rabbitTemplate.convertAndSend(exchangeName,"china.weather","阳光明媚!");
    }

    @RabbitListener(queues = "topic.queue1")
    public  void listenTopicQueue1(String msg) {
        System.out.println("消费者topic.queue1 收到消息====================="+msg);
    }

    @RabbitListener(queues = "topic.queue2")
    public  void listenTopicQueue2(String msg) {
        System.out.println("消费者topic.queue2 收到消息====================="+msg);
    }

结果:
消费者topic.queue2 收到消息=====================日本红色预警!
消费者topic.queue1 收到消息=====================中国蓝色预警!
消费者topic.queue2 收到消息=====================中国蓝色预警!
消费者topic.queue1 收到消息=====================阳光明媚!

标签:String,void,笔记,学习,交换机,消息,msg,RabbitMQ,public
From: https://www.cnblogs.com/ginb/p/17891313.html

相关文章

  • 机器学习的算法——线性回归
    1.回归问题的定位我们知道机器学习分为有监督学习和无监督学习,无监督学习主要是聚类方面的算法,而有监督问题主要分为回归和分类两类而这线性回归就属于有监督学习,且属于其中的回归类问题,另外有一种逻辑回归,他却是属于分类问题的一部分。2.线性回归(1)大体思路首先它是利用......
  • 2023-2024-1 20231403 《计算机基础与程序设计》第十一周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里2023-2024-1计算机基础与程序设计第十一周作业)这个作业的目标自学《计算机科学概论》第15,16章,《C语言程序设计》第10章作业正文https://www.cnblogs.com/lsrmy......
  • Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用
    学习视频:【编程不良人】2021年SpringBoot最新最全教程第五章、JSP模板集成5.1引入JSP依赖<!--引入jsp解析依赖--><!--C标签库--><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></depen......
  • 【项目学习】谷粒商城学习记录5 - 检索服务
    【项目学习】谷粒商城学习记录5-检索服务1、搭建页面环境search模块添加thymeleaf依赖<!--thymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>将资料......
  • Android OpenGl ES 3.0 学习笔记
    titleOpenGLES3.0DrawTriangleJava->JNI:(1)Java_com_oyp_openglesdemo_render_MyNativeRenderer_nativeSetRenderType(100,100)Java->MyGLRenderContext:GetInstance()Java->MyGLRenderContext:SetRenderType(100)noterightofNativeTriangle:GLBaseSample......
  • 解析几何笔记:平面的仿射变换
    目录平面的仿射变换定义放缩变换重要性质点与向量的仿射变换仿射标架的仿射变换变积系数平面的定向平行四边形的仿射变换前后定向面积的特性变积系数及其特性参考平面的仿射变换定义定义平面的一个点变换τ,如果它在一个仿射坐标系中的公式为\[\begin{pmatrix}x'\\y'\end{p......
  • STM32学习笔记_GPIO相关知识&LED流水灯
    GPIO的内部结构:在STM32中,所有的外设都是挂载在APB2外设总线上的,GPIO内包含了寄存器和驱动器,内核通过APB2总线对寄存器进行读写,寄存器的每一位对应每一个引脚。驱动器是用来增强GPIO驱动能力的GPIO位的内部结构:在下结构图中,信号从右边的I/0引脚输入,通过内部的上拉或下拉开关进行到TT......
  • 在OpenCV基于深度学习的超分辨率模型实践
    1.引言OpenCV是一个开源的计算机视觉库,拥有大量优秀的算法。基于最新的合并,OpenCV包含一个易于使用的接口,主要用于实现基于深度学习方法的超分辨率(SR)。该接口包含预先训练的模型,这些模型可以非常容易和有效地用于推理。在这篇文章中,我将解释它可以做什么,并逐步展示如何使用它。闲......
  • 强化学习的第一天,好吧其实是学数学
     本来捏,等后端那边任务差不多完成后,想开始和兄弟们一起学习数据结构与算法捏,但博主机缘巧合,要开始学习强化学习了,这是一个门槛高,但很有意思的领域,祝福我能够学有所成吧,以后可能会发些强化学习的东西,后端和算法应该也多多少少发点,才学第一课,动不动直接给我线代概率论,这门槛。。。......
  • Solidity基本语法学习3
    文档:https://solidity-by-example.org/视频教程:https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p说明:本文内容:Enum,struct,datalocation,function,ViewandPureFunction,ErrorEnum(枚举)Solidity支持枚举,这对modelch......