是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang(高并发语言)语言来编写的,并且RabbitMQ是基于AMQP协议的。
1.1 AMQP协议
Advanced Message Queuing Protocol(高级消息队列协议)
1.2 AMQP专业术语:(多路复用->在同一个线程中开启多个通道进行 *** 作)
- Server:又称broker,接受客户端的链接,实现AMQP实体服务
- Connection:连接,应用程序与broker的网络连接
- Channel:网络信道,几乎所有的 *** 作都在channel中进行,Channel是进行消息读写的通道。客户端可以建立多个channel,每个channel代表一个会话任务。
- Message:消息,服务器与应用程序之间传送的数据,由Properties和Body组成.Properties可以对消息进行修饰,必须消息的优先级、延迟等高级特性;Body则是消息体内容。
- virtualhost: 虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个virtual
- host里面可以有若干个Exchange和Queue,同一个Virtual Host 里面不能有相同名称的Exchange 或 Queue。
- Exchange:交换机,接收消息,根据路由键转单消息到绑定队列
- Binding: Exchange和Queue之间的虚拟链接,binding中可以包换routing key
- Routing key: 一个路由规则,虚拟机可用它来确定如何路由一个特定消息。(如负载均衡)
1.3 RabbitMQ整体架构
主要四个概念:
1:生产者
- 发送消息的
2:消费者
- 接收消息的
3:交换机(Exchange)
- 可以想象成一个路由
4:队列(Queue)
- 指定存放消息的队列
1:简单模式(点对点模式)
描述:一个生产者 P 发送消息到队列 Q,一个消费者 C 接收(有序的消费)
2:工作队列模式(也称为 公平性队列模式)
一个消息生产者,一个交换器,一个消息队列,多个消费者。同样也称为点对点模式
循环分发,RabbitMQ 将按顺序将每条消息发送给下一个消费者,每个消费者将获得相同数量的消息。(循环分发,消费者获取到相同数量的消息)
- 代码中定义参数 durable:true,需要持久化,不然重启MQ数据会丢失
BasicQos参数解析:
- prefetchSize:每条消息大小,一般设为0,表示不限制。
- prefetchCount:1,作用限流,告诉RabbitMQ不要同时给一个消费者推送多于N个消息,消费者会把N条消息缓存到本地一条条消费,如果不设,RabbitMQ会进可能快的把消息推到客户端,导致客户端内存升高。设置合理可以不用频繁从RabbitMQ
获取能提升消费速度和性能,设的太多的话则会增大本地内存,需要根据机器性能合理设置,官方建议设为30。 - global:是否为全局设置。
- 这些限流设置针对消费者autoAck:false时才有效,如果是自动Ack的,限流不生效。
3:发布订阅模式
- Pulish/Subscribe,无选择接收消息,一个消息生产者,一个交换机(交换机类型为fanout),多个消息队列,多个消费者。称为发布/订阅模式
- 在应用中,只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。
生产者P只需把消息发送到交换机X,绑定这个交换机的队列都会获得一份一样的数据。
应用场景:适合于用同一份数据源做不同的业务。
4:路由模式(推荐使用)
在发布/订阅模式的基础上,有选择的接收消息,也就是通过 routing 路由进行匹配条件是否满足接收消息。
- 上图是一个结合日志消费级别的配图,在路由模式它会把消息路由到那些 binding key 与 routing key 完全匹配的Queue 中,此模式也就是 Exchange 模式中的direct模式。
- 生产者P发送数据是要指定交换机(X)和routing发送消息,指定的routingKey=error,则队列Q1和队列Q2都会有一份数据,如果指定routingKey=into,或=warning,交换机(X)只会把消息发到Q2队列。
5:主题模式(其实就是路由模式类型,不过是模糊匹配)
- topics(主题)模式跟routing路由模式类似,只不过路由模式是指定固定的路由键
routingKey,而主题模式是可以模糊匹配路由键 routingKey,类似于SQL中 = 和 like 的关系。
- P 表示为生产者、 X 表示交换机、C1C2 表示为消费者,红色表示队列。
- topics 模式与 routing 模式比较相近,topics 模式不能具有任意的
routingKey,必须由一个英文句点号“.”分隔的字符串(我们将被句点号“.”分隔开的每一段独立的字符串称为一个单词),比如
“lazy.orange.a”。topics routingKey
中可以存在两种特殊字符""与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。
以上图为例:
- 如果发送消息的routingKey设置为:
- aaa.orange.rabbit,那么消息会路由到Q1与Q2,
- routingKey=aaa.orange.bb的消息会路由到Q1,
- routingKey=lazy.aa.bb.cc的消息会路由到Q2;
- routingKey=lazy.aa.rabbit的消息会路由到 Q2(只会投递给Q2一次,虽然这个routingKey 与 Q2 的两个bindingKey 都匹配);
- 没匹配routingKey的消息将会被丢弃。
总结:
以上便是RabbitMQ的6中模式的实际使用,其中(1)简单队列,(2)工作队列,(4)路由模式,(6)RPC模式的交换机类型都是direct,(3)发布订阅的交换机是fanout,(5)topics的交换机是topic。正常场景用的是direct,默认交换机也是direct类型的,推荐用(4)路由模式,因为指定交换机名比起默认的交换机会容易扩展场景,其他的交换机看业务场景所需使用。
下面位置可以看到交换机类型,amq.开头那几个是内置的,避免交换机过多可以直接使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)