Exchange是什么
Exchange就是交换机,用于接收消息,并将根据路由键(routing key)将详细转发到它所绑定的消息队列(queue)。
Exchange属性
- name:Exchange名称;
- type:Exchange类型,包括direct、topic、headers和fanout;
- Durability:是否持久化,true为持久化;
- Auto Delete:当最后一个绑定到该Exchange上的queue删除后,自动删除该Exchange;
- Internal:当前Exchange是否用于RabbitMQ内部使用,默认为false;
- Arguments:扩展参数,用于AMQP协议自制定化使用;
Exchange类型
Direct Exchange:路由模式
所有发送到direct Exchange的消息都会被转发到routing key指定的queue中;Direct模式可以使用RabbitMQ自带的Exchange即:Default Exchange,所以不需要讲Exchange进行任何绑定操作,消息传递时routing key必须完全匹配才能被接收,否则被抛弃;
Topic Exchange:通配符模式
所有发送到topic Exchange的消息都会被转发到routing key中指定topic的queue中;
Exchange将routing key和某个topic进行模糊匹配,此时队列(queue)需要绑定一个topic exchange;
- topic exchange可以使用通配符进行模糊匹配:
- #:匹配一个或多个词;
- :只能匹配一个词;
例如:test.# 可以匹配到 test.aaa 和 test.aaa.bbb;
test. 只能匹配到 test.aaa,不能匹配到test.aaa.bbb;
Fanout Exchange:订阅模式
不处理routing key,只是简单的将queue绑定到Exchange上,发送到该Exchange上的消息都会被转发到所有与该Exchange绑定了的queue上,因此fanout exchange的效率是最高的。
Headers Exchange
也是忽略routingKey的一种路由方式,使用headers中的键值对进行匹配的。Headers是一个键值对,可以定义成Hashtable,发送者在发送的时候定义一些键值对,接收者也可以在绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息。匹配有两种方式all和any。这两种方式是在接收端必须要用键值"x-mactch"来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了。fanout,direct,topic exchange的routingKey都需要要字符串形式的,而headers exchange则没有这个要求,因为键值对的值可以是任何类型。