什么是RabbitMQ
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
RabbitMQ优点
erlang语言的高并发特性,使得它并发性较好,单机万级吞吐量。 功能完备,健壮,稳定,易用,跨平台。 支持主流语言,文档齐全。 开源的管理界面简单易用。 社区活跃度高,更新速度快。
四大核心概念
生产者
产生数据发送消息的程序
消费者
消费与接收含义相似,消费者类似于等待接收消息的程序
交换机
一方面它接收来自生产者的消息,另一方面它将收到的消息推送到队列中,RabbitMQ的交换机有四种不同的类型
队列
本质上是一个大的消息缓冲区,消息只能存储在队列中,多个生产者可以将消息发送到一个队列中,多个消费者也可以尝试从一个队列中取出消息。
交换机种类
Direct Exchange(直连交换机)
消息会传送给绑定键与消息的路由键完全匹配的那个队列。 我们用直连交换机取代了只会无脑广播的扇形交换机,并且具备了选择性接收消息的能力。
Fanout Exchange(扇形交换机)
类似于广播,只要队列与该类型的交换机绑定,所有发送到该交换机的信息都会被转发到所有与之绑定的队列,与routingKey无关。## Topic Exchange(主题交换机)
Topic Exchange(主题交换机)
应用范围最广的交换机类型,消息队列通过消息主题与交换机绑定。一个队列可以通过多个主题与交换机绑定,多个消息队列也可以通过相同消息主题和交换机绑定。并且可以通过通配符(*或者#)进行多个消息主题的适配。
消息主题的一般格式为xxx.xxx.xxx(x为英文字母,每个单词用英文句号隔开)。*通配符可以适配一个单词,#可以适配零个或者多个单词。
通配符适配如下:*.xxx.#。此主题可以适配xxx前面只有一个单词后面有零个或者多个单词的所有消息主题。
Headers Exchange(头交换机)
头交换机类似与主题交换机,但是却和主题交换机有着很大的不同。主题交换机使用路由键来进行消息的路由,而头交换机使用消息属性来进行消息的分发,通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。 在头交换机里有一个特别的参数”x-match”,当”x-match”的值为“any”时,只需要消息头的任意一个值匹配成功即可,当”x-match”值为“all”时,要求消息头的所有值都需相等才可匹配成功。
RabbitMQ工作原理
生产者(Producer)通过信道(Channel)把消息发送给交换机(Exchange),当创建交换机时需要指定类型(四种类型:直接Direct,扇出Fanout ,主题Topic ,消息头Headers ); 交换机(Exchange)接收消息并且负责对消息进行路由,交换机根据消息的属性来把消息分发到不同的队列(Queue)上; 消息(Message)会一直留在队列里直到被消费者(Consumer)消费
相关名词解释
Broker
接收和分发消息的应用
Virtual Host
出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中虚。不同用户使用一个RabbitMQ Server时可划分出多个Vhost,每个用户在自己的vhost下进行操作
Connection
生产者或消费者与Broker间的TCP连接
Channel
在Connection内部建立的逻辑连接,Channel间完全隔离,支持多线程程序 Channel极大地减少了操作系统建立的TCP Connection的开销
队列模式
这里我们只介绍前五种
简单模式Hello World
一个生产者P发送消息到队列Q,一个消费者C接收
工作队列模式Work Queues
一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列
发布/订阅模式 Publish/Subscribe
一个生产者发送的消息会被多个消费者获取。一个生产者、一个交换机、多个队列、多个消费者
路由模式Routing
生产者发送消息到交换机并且要指定路由key,消费者将队列绑定到交换机时需要指定路由key
通配符模式Topic
生产者P发送消息到交换机X,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配; 符号#:匹配一个或者多个词 lazy.# 可以匹配 lazy.irs或者lazy.irs.cor 符号*:只能匹配一个词 lazy.* 可以匹配 lazy.irs或者lazy.cor