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

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. socket参数的详解

    socket参数的详解 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 创建socket对象的参数说明: fami ...

  2. 简单Spring Cloud 微服务框架搭建

    微服务是现在比较流行的技术,对于程序猿而言,了解并搭建一个基本的微服务框架是很有必要滴. 微服务包含的内容非常多,一般小伙伴们可以根据自己的需求不断添加各种组件.框架. 一般情况下,基本的微服务框架包 ...

  3. Taro -- Swiper的图片由小变大3d轮播效果

    Swiper的图片由小变大3d轮播效果 this.state = ({ nowIdx:, swiperH:'', imgList:[ {img:'../../assets/12.jpg'}, {img ...

  4. .net Core——SqlSugar使用

    一.DbContext配置 public class DbContext { public DbContext() { Db = new SqlSugarClient(new ConnectionCo ...

  5. slots_doc_call属性

    class Foo: "这时文档doc属性" __slots__ = ["name","age"] #[“name”=None,“age&q ...

  6. 排序二叉树、平衡二叉树、红黑树、B+树

    一.排序二叉树(Binary Sort Tree,BST树) 二叉排序树,又叫二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree). 1 ...

  7. 线段树维护区间前k小

    线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...

  8. LOJ6358 前夕

    上来4的倍数又要交集恰好 单位根反演+二项式反演定了( 具体推柿子放下面了qwq $g(n) = \sum_{i=n}^N f(i) \binom{i}{n} \\g(n) = \binom{N}{n ...

  9. MySQL--全文索引作用、原理及使用注意

    作用 MySQL索引可以分为:主键索引.普通索引.唯一索引.全文索引.其中,全文索引应该是是比较特殊的,它只有少数的几个存储引擎支持,且只有类型为char.vchar.text的列能建立全文索引.以前 ...

  10. ubuntu16.04 下安装jdk

    1.         在/usr/lib目录下新建jdk mkdir jdk 2.         执行文件移动 sudo mv ./resource/jdk-8u191-linux-x64.tar. ...