开门见山(文末附有消息队列的几个基本概念)

1、直接模式( Direct)模式

直白的说就是一对一,生产者对应唯一的消费者(当然同一个消费者可以开启多个服务)。

虽然使用了自带的交换器(Exchange),但使用的是默认的“”空字符串交换器,

也相当于直接跨过交换器到达消息队列,也是称为直接模式的原因(猜的)

生产者代码:

  @Autowired
private RabbitTemplate rabbitTemplate; /*
普通模式:
*/
@Test
public void SendMag(){
rabbitTemplate.convertAndSend("Not_Copy1","直接模式测试");
}

RabbitMQ管理器:

消费者代码:

服务一
@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("11111Not_Copy1:"+msg);
}
}

服务二
@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("22222Not_Copy1:"+msg);
}
}
服务三
@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("33333Not_Copy1:"+msg);
}
}

消息连发三次

结果:

服务一:11111Not_Copy1:直接模式测试

服务二:22222Not_Copy1:直接模式测试

服务三:33333Not_Copy1:直接模式测试

证明存在着默认的负载均衡。

2、分裂模式(Fanout)模式

直白的说就是一对多,一个生产者对应多个消费者(当然同一个消费者可以开启多个服务)。

使用了自定义的交换器(Exchange),由交换器分发给与当前交换器相 关联的消息队列,

就像发牌员发牌一样。

生产者代码:

  @Autowired
private RabbitTemplate rabbitTemplate;
   /**
* 分裂模式 交换器 Distributor
*/
@Test
public void SendMag1(){
rabbitTemplate.convertAndSend("Distributor","","分裂模式测试");
}

RabbitMQ管理器:

交换器 Distributor 分配了三个消息队列,因为是分裂模式是以Type选  fanout

消费者代码:

消费者一

@Component
@RabbitListener(queues = "Not_Copy1")
public class Customer1 { @RabbitHandler
public void getMsg(String msg){
System.out.println("Not_Copy1:"+msg);
}
}
消费者二
@Component
@RabbitListener(queues = "Not_Copy2")
public class Customer2 { @RabbitHandler
public void getMsg(String msg){
System.out.println("Not_Copy2:"+msg);
}
}

消费者三

@Component
@RabbitListener(queues = "Not_Copy3")
public class Customer3 { @RabbitHandler
public void getMsg(String msg){
System.out.println("Not_Copy3:"+msg);
}
}

消息发送一遍

结果:

消费者一:Not_Copy1:分裂模式测试

消费者二:Not_Copy2:分裂模式测试

消费者三:Not_Copy3:分裂模式测试

注意:每个消费者是一个类(Customer1,Customer2,Customer3),而不是三个消费者写在一个个类中。

3、主题模式(Topic)

直白的说主题模式也是一对多,只不过在分裂模式模式的基础上添加了规则或者说主题,

交换器按照规则或者说按照主题下发,符合规则或者说主题的才下发

生产者代码:

  @Autowired
private RabbitTemplate rabbitTemplate;/*
主题模式
*/
@Test
public void SendMag1(){
rabbitTemplate.convertAndSend("Distributor2","good.abc","主题模式测试");
}
  @Test
public void SendMag2(){
rabbitTemplate.convertAndSend("Distributor2","good.abc.log","主题模式测试");
}
  @Test
public void SendMag3(){
rabbitTemplate.convertAndSend("Distributor2","good.log","主题模式测试");
}

RabbitMQ管理器:

交换器Distributor2 分配了三个消息队列,并为各其配置了主题  因为是分裂模式是以Type选  topic

结果:

生产者:SendMag1(),主题:good.abc ,

对应消费者:Not_Copy1:主题模式测试

生产者:  SendMag2() ,主题:good.abc.log ,

对应消费者:Not_Copy1:主题模式测试

      Not_Copy2:主题模式测试

生产者:  SendMag3() ,主题:good.log ,

对应消费者:Not_Copy1:主题模式测试

      Not_Copy2:主题模式测试

      Not_Copy3:主题模式测试

通过这三个主题大家应该已经熟悉了主题模式的应用。

基本概念:

RabbitMQ Server: 也叫broker server,它是一种传输服务。 他的角色就是维护一条 从Producer到Consumer的路线,保证数据能够按照指定的方式进行传输。

Producer: 消息生产者,如图A、B、C,数据的发送方。消息生产者连接RabbitMQ服 务器然后将消息投递到Exchange。

Consumer:消息消费者,如图1、2、3,数据的接收方。消息消费者订阅队列, RabbitMQ将Queue中的消息发送到消息消费者。

Exchange:生产者将消息发送到Exchange(交换器),由Exchange将消息路由到一个 或多个Queue中(或者丢弃)。Exchange并不存储消息。RabbitMQ中的Exchange有 direct、fanout、topic、headers四种类型,每种类型对应不同的路由规则。

Queue:(队列)是RabbitMQ的内部对象,用于存储消息。消息消费者就是通过订阅 队列来获取消息的,RabbitMQ中的消息都只能存储在Queue中,生产者生产消息并终 投递到Queue中,消费者可以从Queue中获取消息并消费。多个消费者可以订阅同一个 Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者 都收到所有的消息并处理。

RoutingKey:生产者在将消息发送给Exchange的时候,一般会指定一个routing key, 来指定这个消息的路由规则,而这个routing key需要与Exchange Type及binding key联 合使用才能终生效。在Exchange Type与binding key固定的情况下(在正常使用时一 般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过 指定routing key来决定消息流向哪里。RabbitMQ为routing key设定的长度限制为255 bytes。

Connection: (连接):Producer和Consumer都是通过TCP连接到RabbitMQ Server 的。以后我们可以看到,程序的起始处就是建立这个TCP连接。

Channels: (信道):它建立在上述的TCP连接中。数据流动都是在Channel中进行 的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。

VirtualHost:权限控制的基本单位,一个VirtualHost里面有若干Exchange和 MessageQueue,以及指定被哪些user使用

Spring Boot 之 RabbitMQ 消息队列中间件的三种模式的更多相关文章

  1. Spring Boot (25) RabbitMQ消息队列

    MQ全程(Message Queue)又名消息队列,是一种异步通讯的中间件.可以理解为邮局,发送者将消息投递到邮局,然后邮局帮我们发送给具体的接收者,具体发送过程和时间与我们无关,常见的MQ又kafk ...

  2. Spring Boot (26) RabbitMQ延迟队列

    延迟消息就是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 延迟队列 订单业务: 在电商/点餐中,都有下单后30分钟内没有付款,就自动取消订单. 短 ...

  3. 在 CentOS7 上安装 RabbitMQ 消息队列中间件

    RabbitMQ 是流行的开源消息队列系统,是 AMQP(Advanced Message Queuing Protocol 高级消息队列协议)的标准实现,用 erlang 语言开发.RabbitMQ ...

  4. 消息队列中间件(三)Kafka 入门指南

    Kafka 来源 Kafka的前身是由LinkedIn开源的一款产品,2011年初开始开源,加入了 Apache 基金会,2012年从 Apache Incubator 毕业变成了 Apache 顶级 ...

  5. spring boot:thymeleaf模板中insert/include/replace三种引用fragment方式的区别(spring boot 2.3.3)

    一,thymeleaf模板中insert/include/replace三种引用fragment方式的区别 insert: 把整个fragment(包括fragment的节点tag)插入到当前节点内部 ...

  6. Spring boot 使用Redis 消息队列

    package com.loan.msg.config; import com.loan.msg.service.MessageReceiver; import org.springframework ...

  7. 学习Spring Boot:(二十六)使用 RabbitMQ 消息队列

    前言 前面学习了 RabbitMQ 基础,现在主要记录下学习 Spring Boot 整合 RabbitMQ ,调用它的 API ,以及中间使用的相关功能的记录. 相关的可以去我的博客/RabbitM ...

  8. ActiveMQ RabbitMQ RokcetMQ Kafka实战 消息队列中间件视频教程

    附上消息队列中间件百度网盘连接: 链接: https://pan.baidu.com/s/1FFZQ5w17e1TlLDSF7yhzmA 密码: hr63

  9. Spring Boot 整合 rabbitmq

    一.消息中间件的应用场景 异步处理 场景:用户注册,信息写入数据库后,需要给用户发送注册成功的邮件,再发送注册成功的邮件. 1.同步调用:注册成功后,顺序执行发送邮件方法,发送短信方法,最后响应用户 ...

随机推荐

  1. Eclipse Git分支实战

    切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...

  2. Oracle锁表信息处理步骤

    查看是否有锁表的sql select 'blocker(' || lb.sid || ':' || sb.username || ')-sql:' || qb.sql_text blockers, ' ...

  3. linux 性能分析常用命令汇总

    CPU性能分析工具: vmstatpssartimestracepstreetop Memory(内存)性能分析工具:vmstatstracetopipcsipcrmcat /proc/meminfo ...

  4. maven 坐标获取方式

    问题:我们在开发时pom.xml文件中的 <dependencies>     <dependency>         <groupId>org.mybatis& ...

  5. MySQL--limit使用注意

    limit m,n 的意义是在选择.查询得到的结果中,从第m条开始,拿连续的n条作为结果返回.根据它的原理可以知道,select ....limit m,n时要扫描得到的数据条数是m+n条.这就导致m ...

  6. 【leetcode】1161. Maximum Level Sum of a Binary Tree

    题目如下: Given the root of a binary tree, the level of its root is 1, the level of its children is 2, a ...

  7. 华为云服务器centos7.3 安装jdk

    1. 进入oracle官网 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 服 ...

  8. bullet学习日记

    最近需要bullet用物理引擎做一个测量类的项目,因为半途接手,物理部分其实已经实现,但犹于对bullet基本不了解,导致相关部分完全改不动,这两天静下心来把物理引擎用法了解了一翻,顺便做点笔记,以便 ...

  9. docker 内时区和宿主机差8个小时,怎么办?

    docker run -d -it --name tt -e TZ=Asia/Shanghai -p : api 使用-e参数指定时区

  10. luogu P1125 笨小猴 x

    P1125 笨小猴 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设max ...