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(主题交换机)
主题类型topic,直连接类型direct必须是生产者发布消息指定的routingKey和消费者在队列绑定时指定的routingKey完全相等时才能匹配到队列上,与direct不同, topic可以进行模糊匹配,可以使用*和#这两个通配符来进行模糊匹配,其中*可以代替一个单词;主题类型的转发器的消息不能随意的设置选择键(routing_key),必须是由点隔开的一系列的标识符组成,如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”。标识符可以是任何东西,但是一般都与消息的某些特性相关,你可以定义任何数量的标识符,上限为255个字节。 #可以替代零个或更多的单词,只要能模糊匹配上就能将消息映射到队列中。当一个队列的绑定键为#的时候,这个队列将会无视消息的路由键,接收所有的消息。
headers(首部交换机)
首部交换机和扇形交换机都不需要路由键routingKey,交换机时通过Headers头部来将消息映射到队列的,有点像HTTP的Headers,Hash结构中要求携带一个键“x-match”,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了。相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串(string)而是Object类型。
any: 只要在发布消息时携带的有一对键值对headers满足队列定义的多个参数arguments的其中一个就能匹配上,注意这里是键值对的完全匹配,只匹配到键了,值却不一样是不行的;all:在发布消息时携带的所有Entry必须和绑定在队列上的所有Entry完全匹配首部交换机比直连交换机的优势:
直连接适用于计较简单的路由,而首部类型相比直连接匹配规则更强大。a)绑定规则灵活:直连接是一个简单的String;而首部是键值对Entry,而且键值对的value可以是任意类型Objectb)绑定个数灵活:直连接一次只能绑定一个字符串,如果想绑定多个字符串就需要绑定多次或者循环调用queueBind()方法来绑定多次;而首部类型直接可以往Map中添加多个实体Entry即可c)映射规则灵活:直连接只需要比较路由键是否相等即可,而首部类型除了比较value还要比较key,因为首部类型是Entry类型,需要同时比较key和value,而且首部类型还可以通过x-match来控制匹配的条件,all:需要匹配所有Entry,相当于SQL中的and操作,any:只需要匹配上一个Entry即可,相当于SQL中的or操作摘自:https://blog.csdn.net/vbirdbest/article/category/7296570