RabbitMq(三)交换机类型

Exchange Types

direct(交换机的直连接类型

  direct类型会把消息路由到那些binding key与routing key完全匹配的Queue中。(在实际使用RabbitMQ的过程中并没有binding key这个参数,只有routing key,为了区分我们把交换机和队列绑定时传的参数叫binding key,把发送消息时带的这个参数叫routing key)
  交换机的类型用于交换机如何将消息路由到哪些队列中去,在绑定队列时channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY)会将队列名、交换机名称、路由键作为一条记录插入到数据库中,当发布消息时channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, null, message.getBytes(“UTF-8”))会指定交换机名称和路由键,如果将交换机名+路由键 作为联合主键,根据这个联合组件就能查到队列名(EXCHANGE_NAME + ROUTING_KEY)—》QUEUE_NAME, 从而将消息发送到指定的队列,直连接的规则就是绑定的路由键和发布消息的路由键必须完全相等才能路由到关联的队列上,用java代码表示 routingKeyForPublishMessage.equals(routingKeyForQueueBind),直连接就是完全相等,像其他类型可以类似于正则表达式或是数据库中的like的模糊匹配,只要模糊匹配成功就可以将消息路由到指定的队列中。
  适用场景:有优先级的任务,根据任务的优先级把消息发送到对应的队列,这样可以指派更多的资源去处理高优先级的队列。

fanout(扇形交换机)

  fanout是交换机的广播类型,不需要routingKey,交换机会将所有的消息都发送到每个绑定的队列中去。生产者发送到Exchange的所有消息都会路由到绑定的Queue,并最终被多个消费者消费。fanout广播类型在发布消息时可以只先指定交换机的名称,交换机的声明的代码可以放到消费者端进行声明,队列的声明也放在消费者端来声明。

  发布订阅类似观察者模式设计模式,一般适用于当接收到某条消息时同时做多种类似的任务的处理,如一个发短信,另一个发邮件,一个插入数据库,另一个保存在文件等类似操作,扇形交换机将消息传送给不同的队列,不同的队列对同一种消息采取不同的行为。

  扇形交换机是最基本的交换机类型,它所能做的事情非常简单———广播消息。扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要“思考”,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。

topic(主题交换机

前面讲到direct类型的Exchange路由规则是完全匹配binding key与routing key,但这种严格的匹配方式在很多情况下不能满足实际业务需求。topic类型的Exchange在匹配规则上进行了扩展,它与direct类型的Exchage相似,也是将消息路由到binding key与routing key相匹配的Queue中,但direct是完全匹配,而通过topic可以进行模糊匹配
routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
binding key与routing key一样也是句点号“. ”分隔的字符串
binding key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

headers(首部交换机)

扫描二维码关注公众号,回复: 6535756 查看本文章

headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。(实际中我并有用过)

猜你喜欢

转载自www.cnblogs.com/aaronRhythm/p/11042624.html