MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.
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 绑定起来。
一、点对点的队列
生产者实现思路
创建连接工厂 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, 创建消费者并监听队列,从队列中读取消息。
二、工作队列模式 Work Queue
功能描述:一个生产者发送消息到队列中,有多个消费者共享一个队列,每个消费者获取的消息是唯一的。
为了保证服务器同一时刻只发送一条消息给消费者,保证资源的合理利用。channal.basicQos(1); 这样是为了保证多个消费者接收的消息数量不一样,能者多劳,如果不设置,那么消费者是平均分配消息(例如 10 条消息,每个消费者接收 5 条)
三、发布 / 订阅模式 Publish/Subscribe
这个可能是消息队列中最重要的队列了,其他的都是在它的基础上进行了扩展。
功能实现:一个生产者发送消息,多个消费者获取消息(同样的消息),包括一个生产者,一个交换机,多个队列,多个消费者。
思路解读(重点理解):
(1)一个生产者,多个消费者
(2)每一个消费者都有自己的一个队列
(3)生产者没有直接发消息到队列中,而是发送到交换机
(4)每个消费者的队列都绑定到交换机上
(5)消息通过交换机到达每个消费者的队列
ps:交换机没有存储消息功能,如果消息发送到没有绑定消费队列的交换机,消息则丢失。
四、路由模式 Routing
功能:生产者发送消息到交换机并指定一个路由 key,消费者队列绑定到交换机时要制定路由 key(key 匹配就能接受消息,key 不匹配就不能接受消息),例如:我们可以把路由 key 设置为 insert ,那么消费者队列 key 指定包含 insert 才可以接收消息,消费者队列 key 定义为 update 或者 delete 就不能接收消息。很好的控制了更新,插入和删除的操作。
五、通配符模式 Topics
说明:此模式实在路由 key 模式的基础上,使用了通配符来管理消费者接收消息。生产者 P 发送消息到交换机 X,type=topic,交换机根据绑定队列的 routing key 的值进行通配符匹配;
符号#:匹配一个或者多个词 lazy.# 可以匹配 lazy.irs 或者 lazy.irs.cor
符号:只能匹配一个词 lazy. 可以匹配 lazy.irs 或者 lazy.cor
总结
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://www.cnblogs.com/ituac/p/10026449.html