rabbitMQ基础知识--交换机
1、交换机类型:4种:Direct exchange、Fanout exchange、Topic exchange、Headers exchange
Direct exchange:直连交换机(默认的交换机),转发消息到routigKey指定的队列,是一种完全匹配的关系。这种模式下,routingKey与队列之间可以是一对一,一对多,多对多,多对一等形式。 只要发送消息的routingKey与交换机的 一致,就会把消息放到对应的队列。
rabbitTemplate.convertAndSend(exchange, routingKey, message, correlationId);
比如:发送的消息的key是:key2,那么testQueue1、testQueue2队列中都会有这个消息。
直连交换机是一种带路由功能的交互机,一个队列通过routing_key与一个交换机绑定,当消息被发送的时候,需要指定一个routing_key,这个消息被送达交换机的时候,就会被交换机送到指定的队列里面去。同样一个routing_key也是支持应用到多个队列中的,当一个交换机绑定多个队列时,消息就会被送到对应的队列去处理。
适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。
Fanout exchange:扇形交换机,转发消息到所有绑定队列(速度最快)
Topic exchange:主题交换机,按规则转发消息(最灵活)
直连交换机的routing_key方案非常简单,如果我们希望一条消息发送给多个队列,那么这个交换机需要绑定上非常多的routing_key,假设每个交换机上都绑定一堆的routing_key连接到各个队列上。那么消息队列的管理就会异常的困难。
所以RabbitMQ提供了一种主题交换机,发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。
主题交换机的routing_key需要有一定的规则,交换机和队列的binding_key需要采用*.#.*.....的格式,每个部分用.分开,其中:
*表示一个单词
#表示任意数量(零个或多个)单词。
假设有一条消息的routing_key为fast.rabbit.white,那么带有这样binding_key的几个队列都会接收这条消息:
fast..
..white
fast.#
……
下图来源于网上,感觉对主题交换机的描述比较到位:
适用场景:消息需要基于多重条件进行路由到达对应队列,例如:日志系统,不仅可以根据日志的级别而且能根据日志的来源进行订阅。
Headers exchange:首部交换机 (未接触)