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

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. 利用mysql中if函数排序

    格式:IF(Condition,A,B) 意义:当Condition为TRUE时,返回A:当Condition为FALSE时,返回B. 作用:作为条件语句使用. select if(`from_use ...

  2. PAT Basic 1014 福尔摩斯的约会 (20 分) Advanced 1061 Dating (20 分)

    大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就明白了,字条上奇 ...

  3. MySQL 赋予用户权限(grant %-远程和localhost-本地区别)

    不过有些时候(有些版本)'%'不包括localhost,要单独对@'localhost'进行赋值,这事真让我遇上了,在对mysql5.1.32建立远程用户时. 分别对'%'和'localhost'授权 ...

  4. oracle date函数

    常用的时间格式 在oracle中有 yyyy-mm-dd hh24:mi:ss  而在Java中有些区别 为yyyy-MM-dd HH:mm:ss 这点还是经常容易模糊的.相信很多人都有过统计某些数据 ...

  5. mac下安装 rabbitMq

    1.安装HomeBrew,如果已经安装这一步跳过. 2.用brew install rabbitmq指令即可进行rabbitmq服务的自动安装. 3.安装完成之后会出现一下提示:   rabbit安装 ...

  6. 关于在IOS中 contenteditable=true 无法输入的问题

    解决: 1.添加样式-webkit-user-select:text 2.如果引入了fastclick,需要添加个类名 needsclick 来源于知乎(https://www.zhihu.com/q ...

  7. 【02】Python 字符串、列表、元组、字典

    1 列表 list就是一种采用分离式技术实现的动态顺序表(tuple也一样): 在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区: 在执行插入操作(insert或append)时,如果 ...

  8. 【华容道】题解(NOIP2013提高组day2)

    分析 这道题很容易想到令f[x][y][x1][y1]表示空白块在(x,y).指定棋子在(x1,y1)时的最少步数,让空白块和四周的棋子交换,当空白块要和指定棋子交换时,把指定棋子移动,搞一下BFS就 ...

  9. Mac升级系统后 Pod Install报错-不能用 解决办法

    brew reinstall cocoapods brew install ruby brew link --overwrite cocoapods 最近将Mac OS升级到10.15.1 ,再回来初 ...

  10. React Native 中 static的navigationOptions中的点击事件不能用this

    想在某个页面中设置导航栏,title + 左右按钮(按钮上肯定需要有事件) static navigationOptions = ({ navigation, navigationOptions }) ...