文章目录
1.什么是消息队列
2.消息队列有什么用
用途:不同进程Process/线程Thread之间通信,主要可以分为三类。
- 解耦
- 异步
- 削峰
3.什么是交换机
决定消息如何分发
4.RabbitMQ的四种交换机
4.1.Direct Exchange(直连交换机)
处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “abc”,则只有被标记为“abc”的消息才被转发,不会转发abc.def,也不会转发dog.ghi,只会转发abc。
4.2.Fanout Exchange(扇形交换机)
不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
4.3.Topic Exchange(主题交换机)
将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。
4.4.Headers Exchanges(头部交换机)
不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。
匹配规则x-match有下列两种类型:
x-match = all :表示所有的键值对都匹配才能接受到消息
x-match = any :表示只要有键值对匹配就能接受到消息
5.RabbitMQ的五种队列
5.1.Simple Work Queue (简单工作队列)
P 表示为生产者 、C 表示为消费者,红色表示队列。
也就是常说的点对点模式,一条消息由一个消费者进行消费。(当有多个消费者时,默认使用轮训机制把消息分配给消费者)。
5.2.Work Queues (工作队列)
也叫公平队列,能者多劳的消息队列模型。队列必须接收到来自消费者的 手动ack 才可以继续往消费者发送消息。
将耗时的消息处理通过队列分配给多个consumer来处理,我们称此处的consumer为worker,我们将此处的queue称为Task Queue。
其目的是为了避免资源密集型的task的同步处理,以及立即处理task并等待完成。相反,调度task使其稍后被处理。以及把task封装进message并发送到task queue,worker进程在后台运行,从task queue取出task并执行job,若运行了多个worker,则task可在多个worker间分配。
5.3.Publish/Subscribe (发布订阅模式)
- 1个生产者,多个消费者
- 每一个消费者都有自己的一个队列
- 生产者没有将消息直接发送到队列,而是发送到了交换机
- 每个队列都要绑定到交换机
- 生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的
注意:一个消费者队列可以有多个消费者实例,只有其中一个消费者实例会消费
5.4.Routing(路由模式)
有选择的接收消息。
5.5.Topics (主题模式)
通过一定的规则来选择性的接收消息
6.消息模式与其对应的交换机
消息模式 | 交换机 |
---|---|
Simple Work Queue (简单工作队列),Work Queues (工作队列) | 空交换机 |
Publish/Subscribe (发布订阅模式) | fanout (扇形交换机) |
Routing(路由模式) | direct (直连交换机) |
Topics(主题模式) | topic(主题交换机) |