1、Direct交换机:转发消息到routingKey指定队列(完全匹配,单播)。
routingKey与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“dog”,则只转发routingkey标记为dog的消息,不会转发dog.puppy,也不会转发dog.guard等。
2、Topic交换机:按规则转发消息(最灵活,组播)
Topic类型交换机通过模式匹配分配消息的routing-key属性。将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。
它将routing-key和binding-key的字符串切分成单词。这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“*”。#匹配0个或多个单词,*匹配不多不少一个单词。
例如,binding key:*.stock.#匹配routing key: usd.stock和eur.stock.db,但是不匹配stock.nana。
例如,“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*”只会匹配到“audit.irs”。
3、Fanout交换机:转发消息到所有绑定队列(最快,广播)
fanout交换机不处理路由键,简单的将队列绑定到交换机上,每个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
4、Note
- 如果没有队列绑定在交换机上,则发送到该交换机上的消息会丢失。
- 一个交换机可以绑定多个队列,一个队列可以被多个交换机绑定。
- 还有一些其他类型的交换机类型,如header、failover、system等,现在在当前的RabbitMQ版本中均未实现。
- 因为交换机是命名实体,声明一个已经存在的交换机,但是试图赋予不同类型是会导致错误。客户端需要删除这个已经存在的交换机,然后重新声明并且赋予新的类型。
- 交换机的属性:
- 持久性:如果启用,交换机将会在server重启前都有效。
- 自动删除:如果启用,那么交换机将会在其绑定的队列都被删掉之后删除自身。
- 惰性:如果没有声明交换机,那么在执行到使用的时候会导致异常,并不会主动声明。