RabbitMQ基本概念
RabbitMQ是实现AMQP的消息中间件,AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全
Broker
:消息队列服务器实体Exchange
:消息交换机,接收生产者发过来的消息,并将这些消息推送到队列中。它指定消息按特定规则,路由到哪个队列,用于转发消息,但是它不会做存储 ,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。 这里有一个比较重要的概念:路由键 。消息到交换机的时候,交互机会转发到对应的队列中,那么究竟转发到哪个队列,就要根据该路由键Queue
:消息队列载体,每个消息都会被投入到一个或多个队列Binding
:绑定,它的作用就是把exchange和queue按照路由规则绑定起来Routing Key
:路由关键字,exchange根据这个关键字进行消息投递VHost
:虚拟主机,vhost 可以理解为虚拟 broker ,即 mini-RabbitMQ server。其内部均含有独立的 queue、exchange 和 binding 等,拥有独立的权限系统,可以做到 vhost 范围的用户控制。一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。 因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机”/“Producer
:消息生产者Consumer
:消息消费者Channel
:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务
四种交换机
交换机有四种类型:Direct, topic, Headers和Fanout
Direct Exchange
direct 类型的行为是”先匹配,再投送”,即在绑定时设定一个 routingkey,消息的routingkey 完全匹配时,才会被交换器投送到绑定的队列中去,是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列
1 | channel.exchangeDeclare("exchangeName",BuiltinExchangeType.DIRECT); |
Topic Exchange
按规则转发消息(最灵活) 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。
路由键必须是一串字符,用句号(.) 隔开,
符号#匹配一个或多个词,good.#可以匹配到good.book.ThreeKingdoms
符号匹配一个词,good.\只可以匹配到good.book
Headers Exchange
设置header attribute参数类型的交换机,相较于 direct 和 topic 固定地使用 routing_key,headers 则是一个自定义匹配规则的类型,在队列与交换器绑定时,会设定一组键值对规则,消息中也包括一组键值对( headers 属性),当这些键值对有一对,或全部匹配时,消息被投送到对应队列
Fanout Exchange
转发消息到所有绑定队列,消息广播的模式,会把消息发给绑定给它的全部队列,不处理路由键,如果配置了routing_key会被忽略
Fanout交换机转发消息是最快的