文档章节

消息队列RabbitMq的五种形式队列

xiaomin0322
 xiaomin0322
发布于 2018/05/11 15:18
字数 1980
阅读 181
收藏 9

MQ全称为Message Queue,消息队列是系统之间的通信方法;

RabbitMQ是开源的,实现了AMQP协议的,采用Erlang(面向并发编程语言)编写的,可复用的企业级消息系统;

AMQP(高级消息队列协议)是一个异步消息传递所使用应用层协议规范,为面向消息中间件设计,基于此协议的客户端与消息中间件可以无视消息来源传递消息,不受客户端、消息中间件、不同的开发语言环境等条件的限制;

 

  •  涉及概念解释: 
  •  Server(Broker):接收客户端连接,实现AMQP协议的消息队列和路由功能的进程;
  •  Virtual Host:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue。   
  •  Exchange:交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue。
  •  ExchangeType:交换机类型决定了路由消息行为,RabbitMQ中有三种类型Exchange,分别是fanout、direct、topic;
  •  Message Queue:消息队列,用于存储还未被消费者消费的消息;
  •  Message:由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等;body是真正需要发送的数据内容;
  • BindingKey:绑定关键字,将一个特定的Exchange和一个特定的Queue绑定起来。

 

 

1.点对点的队列

  功能:一个生产者P发送消息到队列Q,一个消费者C接收

 

  生产者实现思路:

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue,使用通道channel向队列中发送消息,关闭通道和连接。

  消费者实现思路

创建连接工厂ConnectionFactory,设置服务地址127.0.0.1,端口号5672,设置用户名、密码、virtual host,从连接工厂中获取连接connection,使用连接创建通道channel,使用通道channel创建队列queue, 创建消费者并监听队列,从队列中读取消息。

 

2 工作队列模式Work Queue

     

功能描述:一个生产者发送消息到队列中,有多个消费者共享一个队列,每个消费者获取的消息是唯一的。

为了保证服务器同一时刻只发送一条消息给消费者,保证资源的合理利用。channal.basicQos(1);这样是为了保证多个消费者接收的消息数量不一样,能者多劳,如果不设置,那么消费者是平均分配消息(例如10条消息,每个消费者接收5条)

3 发布/订阅模式Publish/Subscribe

这个可能是消息队列中最重要的队列了,其他的都是在它的基础上进行了扩展。

 

功能实现:一个生产者发送消息,多个消费者获取消息(同样的消息),包括一个生产者,一个交换机,多个队列,多个消费者。

 思路解读(重点理解): 

(1)一个生产者,多个消费者

(2)每一个消费者都有自己的一个队列

(3)生产者没有直接发消息到队列中,而是发送到交换机

(4)每个消费者的队列都绑定到交换机上

(5)消息通过交换机到达每个消费者的队列

注意:交换机没有存储消息功能,如果消息发送到没有绑定消费队列的交换机,消息则丢失。

 

4 路由模式Routing

功能:生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要制定路由key(key匹配就能接受消息,key不匹配就不能接受消息),例如:我们可以把路由key设置为insert ,那么消费者队列key指定包含insert才可以接收消息,消费者队列key定义为update或者delete就不能接收消息。很好的控制了更新,插入和删除的操作。

 

应用RabbitMQ,我们可以根据需求选择5种队列之一。

我的总结

一、简单队列 

P:消息的生产者 
C:消息的消费者 
红色:队列

简单队列的生产者和消费者关系一对一 
但有时我们的需求,需要一个生产者,对应多个消费者,那就可以采用第二种模式 
二、Work模式 
 
一个生产者、2个消费者。 
但MQ中一个消息只能被一个消费者获取。即消息要么被C1获取,要么被C2获取。这种模式适用于类似集群,能者多劳。性能好的可以安排多消费,性能低的可以安排低消费。

但如果面对我需要多个消费者都对这一消息进行消费的需求,这种模式显然就不适用了。那就可以采用第三种模式:

三、订阅模式 
订阅模式 
1、1个生产者,多个消费者 
2、每一个消费者都有自己的一个队列 
3、生产者没有将消息直接发送到队列,而是发送到了交换机 
4、每个队列都要绑定到交换机 
5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的 
这种模式可以满足消费者发布一个消息,多个消费者消费同一信息的需求,但C1、C2消费的都是相同的数据,有时我们需要C1和C2消费的信息只有部分差异,比如我们需求:C1消费增加的数据,C2消费编辑、增加和删除的数据。 
这是可以引入第四种模式: 
四:路由模式: 
路由模式
路由模式是在订阅模式基础上的完善,可以在生产消息的时候,加入Key值,与key值匹配的消费者消费信息。

但路由模式中,就如三中提到的C1、C2、如果C2对应的类型更多,就需要写很多key值。但其实它只与C1有一点差别。那就可以考虑第五种模式: 
五:通配符模式 
topic模式
通配符模式是在路由模式的升级,他允许key模糊匹配。*代表一个词,#代表一个或多个词。通过通配符模式我们就可以将C1对应的一个key准确定为item.add。而C2我们就不需要一一写出key值,而是用item.#代替即可。

5 通配符模式Topics

 

说明:此模式实在路由key模式的基础上,使用了通配符来管理消费者接收消息。生产者P发送消息到交换机X,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配;

符号#:匹配一个或者多个词lazy.# 可以匹配lazy.irs或者lazy.irs.cor

符号*:只能匹配一个词lazy.* 可以匹配lazy.irs或者lazy.cor

6.spring集成rabbitmq配置

提供了AMQP的一个实现,并且spring-rabbit是RabbitMQ的一个实现,下面给出订阅者模式的事例配置如下:

7.总结

RabbitMQ提供了6种模式,分别是HelloWorld,Work Queue,Publish/Subscribe,Routing,Topics,RPC Request/reply,本文详细讲述了前5种,并给出代码实现和思路。其中Publish/Subscribe,Routing,Topics三种模式可以统一归为Exchange模式,只是创建时交换机的类型不一样,分别是fanout、direct、topic。Spring提供了rabbitmq的一个实现,所以集成起来很方便,文章第4章给出了订阅者模式的一种spring配置。

本文转载自:https://blog.csdn.net/onlybymyself/article/details/76417613

xiaomin0322
粉丝 146
博文 3935
码字总数 199458
作品 0
上海
架构师
私信 提问
springboot 集成rabbitmq 并采用ack模式 以及封装队列定义

rabbitmq简介 rabbitmq 是spring所在公司Pivotal自己的产品 是基于AMQP高级队列协议的消息中间件 采用erlang开发 因此安装需要erlang环境 具体安装根据自己的环境 因为跟spring有共同的血缘关...

码农小胖哥
2018/02/27
10.1K
14
RabbitMq入门级教程之完全掌握5种开发方案

1、安装 windows安装rabbitmq mac安装rabbitmq 需要注意的是,mac安装rabbitmq,启动的时候命令前,需要加 sudo,不然会报错误 2、rabbitmq 开发概念词 2.1 Producer(生产者) 2.2 Consumer...

木九天
08/22
238
0
在Kubernetes上使用Sateful Set部署RabbitMQ集群

前面我们已经在Kubernetes上部署了Redis – 《在Kubernetes上使用Sateful Set部署Redis》。 本篇我们继续把RabbitMQ也跑在K8S上。 1.RabbitMQ的基础知识 在正式开始部署工作之前,我们先来复...

店家小二
2018/12/14
0
0
三、RabbitMQ如何实现AMQ协议(读书笔记)

AMQP作为一种RPC传输机制 RabbitMQ作为一种AMPQ代理服务器,提供了一套严格的通信方式,核心部分的通信几乎都使用了RPC(远程过程调用)模式。 启动会话 AMQP协议定义,当客户端要与RabbitM...

XuePeng77
03/12
88
0
Springboot 集成rabbitmq

RabbitMQ是一款基于AMQP(消息队列协议),由Erlang开发的开源消息队列组件。是一款优秀的消息队列组件,他由两部分组成:服务端和客户端,客户端支持多种语言的驱动,如:.Net、JAVA、Erlan...

江火似流萤
2017/11/02
92
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:TCP/IP协议

一、介绍 TCP协议属于OSI七层模型中的传输层协议,提供处于网络连接中的两台计算机之间的数据 传输。   在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议...

浮躁的码农
4分钟前
1
0
一言不合就删库跑路?万名贡献者和阿里巴巴开源的二三事

9 月 27 日云栖大会,阿里巴巴宣布贾扬清担任开源技术委员会负责人。 有人问:开源是为了什么? 从个人视角看,可以证明自己的专业能力,获得行业认可; 从企业视角看,可以建立技术影响力,...

大涛学弟
15分钟前
2
0
JAVA编程注意事项(性能篇)

1. 尽量在合适的场合使用单例 使用单例可以缩短加载的时间,提高加载的效率,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问; 第二,控制实例的产生...

你好夜故事
16分钟前
2
0
List 前端 AngularJS JS 对IP排序

数据格式 $scope.dataList=[ {"ip":"192.168.10.10", "port":"8080",...}, { "ip":"192.168.10.12", "port":"8080",... } ,.....] 调用 $scope.ipSortForward($scope.dataList,"ip") 核心代码......

最菜最菜之小菜鸟
16分钟前
2
0
浅析Cassandra LeveledCompactionStrategy

前言 Cassandra是基于LSM架构的分布式数据库。LSM中有一个很重要的过程,就是压缩(Compaction)。默认的压缩策略是SizeTieredCompactionStrategy,今天主要说一下另一种压缩策略LeveledComp...

阿里云官方博客
21分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部