RabbitMQ的本质就是消息队列,其内部结构包括交换机、路由key、bindings、队列等组件
Server:又称为broker,接受客户端的连接,实现AMQP实体服务。安装rabbitmq-server。我们可以将其理解为RabbitMQ集群中的一个节点
Connection:连接,用于应用程序和broker的网络连接,其本质是TCP/IP的三次握手和四次挥手
Channel:网络信道,几乎所有RabbitMQ的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立多个Channel,每个Channel代表一个会话任务
Message:应用程序之间所传递的消息,由Properties和Body组成,Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性,Body则是消息体的内容
Virtual Host:虚拟地址,用于进行逻辑隔离,一个虚拟主机里可以有若干个Exchange和Queue,同一个虚拟主机里不能有相同名字的Exchange
它就好比我们的硬盘分区,之所以进行硬盘分区的原因就是为了隔离,方便我们管理。实际工作中,通常是一个业务模块一个虚拟地址,比如客流模块就是/passengerFlow,车流模块就是/carFlow,方便我们查看
Exchange:交换机,接受消息,根据路由key发送消息到绑定的队列
注意:交换机本身不具备消息存储的能力
Bindings:Exchange和Queue之间的虚拟连接,binding中可以包含多个key
Routing key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息
Queue:队列,也叫Messge Queue,消息队列,它保存消息并将消息转发给消费者
面试题:可以存在没有交换机的队列吗?
不可能。如果我们没有给队列指定交换机,那么该队列将会和默认交换机绑定。在RabbitMQ中,消息一定是通过交换机传递给队列的,这个和底层语言的选择有关,RabbitMQ由Erlang开发,而Erlang是专门开发交换机的语言
交换机的几种类型
fanout:发布订阅模式。当交换机接收到消息并发布,交换机绑定了多少个队列,就有多少个队列接受到该消息
direct:路由模式。当交换机绑定队列时,可设置路由key。当交换机发布消息的时候,选择想要将消息发送给哪个路由key,该路由器对应的队列就会收到消息
topic:主题模式。其实就是路由模式的进阶版,我们在设置路由key的时候,还可以加上通配符,比如:*.order.#
通配符有两种,*和#。*的意思是有且只能有一级,com.order.lala这种是对的,cn.com.order.lala这种就不对了,因为order前面只能有一级
#的意思是可以有一级、多级,也可以没有。比如com.order,或者com.order.lala.lala,都可以
header:参数模式。
当交换机和队列绑定时,可以绑定一些参数,当header类型的交换机发送消息时,选择我们想要发送的参数,比如我们选择x=1和y=2
这条消息就会发送给queue1和queue2