RabbitMQ是一个消息代理 , 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
RabbitMQ的5大核心概念: Connection (连接),Channel (信道) , Virtual host (虚拟主机),Exchange (交换机) , Queue (队列),
为了大家便于理解,我们先来看一张图,这张图说明了RabbitMQ 的工作模型。

其中,Broker 表示 RabbitMQ 服务,每一个RabbitMQ 至少会存在一个 Virtual host (虚拟主机),而每一个虚拟主机有自己的交换机,队列。
生产者和消费者与RabbitMQ 建立连接时,客户端【生产者和消费者】会创建多个信道【虚拟连接】,用来发送和接收消息。
Connection (连接)
每个生产者和消费者要通过RabbitMQ 发送和消费 消息,都需要和RabbitMQ 建立连接,也是一个TCP长连接。
Channel (信道)
Channel是Connection的基础上建立的虚拟连接,RabbitMQ 处理的每条AMQP 指令都是通过信道完成的。
这里简单说一下AMQP 模型: 生产者通过routing key 投递消息到exchange,exchange根据routing key 与binding key 进行映射 ,然后路由投递到具体队列。
依据Connection 的功能就能完成信道的工作,为啥我们还要引入信道呢?
答:如果有这样的一个场景,一个应用程序有很多个线程从RabbitMQ 中生产或消费 消息,那必然需要建立很多个Connection ,也是多个 TCP 连接。
而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。
RabbitMQ 采用类似 NIO,选择 TCP 连接复用,不仅可以减少性能开销,同时也便于管理。
每个线程一个信道,这样就复用了Connection 的TCP连接,每一个信道上会指派一个唯一的ID , 这样也保证了消息的独立性及安全,信道之间完全是隔离的。
Virtual host (虚拟主机)
Virtual host 是一个虚拟主机的概念,一个RabbitMQ 中可以至少会存在一个 Virtual host,每一个Virtual host 都会有自己的交换机和队列,同一个Virtual host 中的交换机和队列都不能有重名的,不同的Virtual host 中交换机 和 队列 可以重名,这样不同的用户在访问同一个RabbitMQ服务时,可以创建单独的虚拟主机,然后在自己的虚拟主机上创建交换机和队列,很好的做到了不同用户之间相互隔离的效果。
Queue (队列)
Queue 是一个用来存放消息的队列,生产者发送的消息会被放到消息队列中,消费者消费消息时,也是从队列中取走消息。
Exchange (交换机)
Exchange是一个很重要的概念,它是消息到达RabbitMQ的第一站,主要负责根据不同的分发规则将消息分发到不同的Queue,供订阅了相关Queue的消费者消费到指定的消息。那Exchange有哪些分发消息的规则呢?这就要说到Exchange的4种类型了:direct、fanout、topic、headers。
Direct类型
也是默认类型,在没有指定type的exchange时,默认就是direct 类型。direct的意思是直接的,direct类型的Exchange会将消息转发到指定Routing-key的Queue上,Routing-key的解析规则为精确匹配。也就是只有当producer发送的消息的Routing-key与某个Binding-key相等时,消息才会被分发到对应的Queue上,如果没有匹配到对应的Queue上 ,该消息会丢失。它的适用场景其实和广播模式有些相像,只不过是设置了允许的条件(如L:Routing-key 等于 Binding-key)。
这里举个例子: 生产者Routing-key(路由键名称:order) 指向 Direct类型交换机(名称:my-direct-exchange) , 这个交换机下面绑定了三个queue,binding-key分别是order/good/stock ,然后我们向该Exchange(my-direct-exchange)中发送一条消息,消息的Routing-key是order,按照规则是在binding-key为order的队列上消费的。
也就是说,direct类型的Exchange在分发消息时,必须保证producer发送消息的Routing-key与Exchange和Queue绑定的Binding-key相等才可以。
Fanout类型
也称广播类型,Fanout类型的Exchange不处理Routing-key,而是会发送到绑定到该交换机上所有queue,它的适用场景,一端发送,多端需要使用,也就是说重复消费(例如:作者推文到每个粉丝里面)
Topic类型
也是主题类型,topic类型的Exchange会根据通配符对Routing-key进行匹配,只要Routing-key满足某个通配符的条件,就会被路由到对应的Queue上。
通配符的匹配规则如下:
1. Routing-key必须是一串字符串,每个单词用“.”分隔;
2. 符号“#”表示匹配一个或多个单词;
3. 符号“*”表示匹配一个单词。
例如:" *.123 " 能够匹配到 " abc.123 ",但匹配不到 " abc.def.123 “;” #.123 " 既能够匹配到 " abc.123 ",也能匹配到 " abc.def.123 "。
该类型比较灵活 ,大家可根据自己的场景适用以上类型哦。
Headers类型
该类型就不做描述了,以上3种类型已经能够满足我们所有的需求了。需要了解的同学可以自行百度一下。