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

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 就不能接收消息。很好的控制了更新,插入和删除的操作。
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 配置。