一、rabbitmq的组件
1.交换机
Direct Exchange
处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “abc”,则只有被标记为“abc”的消息才被转发,不会转发abc.def,也不会转发dog.ghi,只会转发abc。
Fanout Exchange
不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
Topic Exchange
将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。
Headers Exchanges
不处理路由键。而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配;如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers属性是一个键值对,可以是Hashtable,键值对的值可以是任何类型。而fanout,direct,topic 的路由键都需要要字符串形式的。
2.队列
1、队列可以提前声明好,同时可以声明好和交换机的绑定关系,也可以在消费端声明。
channel.queueDeclare(
channel.exchangeDeclare(
2、消费者 接收消息时,只需要监听对应的队列即可,因为消息不是停留在交换机,而是一定发送到队列当中的。
== 所以当不需要交换机存在时,生产消费模型依然可以发生作用,此时生产者在代码当中是根据路由键发出消息的,这个路由键就是队列的名称。此时消费者可以监听该队列名称也就是路由键名称,来接收消息。==
3、路由关键字
关键字的作用的场景是:direct、topic交换机和一个或者多个队列产生绑定关系,并且有关键字声明在两者中间,那么在生产者向交换机发送消息时,交换机会根据路由关键字发送到不同的队列当中。