RabbitMQ的路由机制
来源:互联网 发布:查看oracle监听端口 编辑:程序博客网 时间:2024/05/17 03:20
要了解RabbitMQ的路由机制,exchange是一个关键。exchange可以叫做交换机,也似乎可以叫做路由器,反正它是用来选择路由的。
RabbitMQ的核心思想就是消息的发布者不是直接把消息发送到目标队列中的,事实上,通常它并不知道消息要发到哪个队列中,它只知道把消息队列发送到exchange中。exchange一边接收发送者发过来的消息,而另一边则把消息发送到目标队列中去。exchange一定知道哪些队列需要接收这个消息,是加到一个队列里还是加到好几个队列里,还是直接扔掉。
如果用空字符串去申明一个exchange,那么系统就会使用”amq.direct”这个exchange。前面我们使用的都是amq.direct类型。
channel.BasicPublish(“”, “TaskQueue”, properties, bytes);
direct exchange 发送消息是要看routingKey的。举个例子,定义了一个direct exchange 名字是X1,然后一个queue名字为Q1 用routingKey=K1 绑定到exchange X1上,
当一个routeKey为 K2 的消息到达X1上,那么只有K1=K2的时候,这个消息才能到达Q1上。
direct:消息会被推送至绑定键(binding key)和消息发布附带的选择键(routing key)完全匹配的队列。
默认有”AMQP default”,它用一个空字符串表示,它是direct类型的exchange,任何发往这个exchange的消息都会被路由到routing key的名字对应的队列上,
如果没有对应的队列,则消息会被丢弃。
声明exchange channel.basicPublish(exchange, routingKey, props, body); 发布消息 channel.basicPublish(exchange, routingKey, null, message .getBytes()); 消费端绑定routing key channel.queueBind(queue, exchange, routingKey) 接收消息 channel.basicConsume(queue, true, consumer);
fanout:就是简单的广播,而且是忽略routingKey的。所以只要是有queue绑定到fanout exchange上,通过这个exchange发送的消息都会被发送到那些绑定的queue中,不管你有没有输入routingKey。当routingKey只是有#号的时候,它的行为和fanout的行为是一样的。当routingKey什么的没有,空字符串的时候,它的行为是和direct是一样的。要注意的是,符号代表的是词不是字符。RabbitMQ中在表达式中词的定义是以.(点号)分隔的。
声明exchange channel.exchangeDeclare(exchange, “fanout”); 发布消息 channel.basicPublish(exchange, queue, null, message .getBytes()); 消费端绑定 channel.queueBind(queue, exchange, “”); 接收消费 channel.basicConsume(queue, true, consumer);
topic:类型的exchange给与我们更大的灵活性。通过定义routingKey可以有选择的订阅某些消息,此时routingKey就会是一个表达式。exchange会通过匹配绑定的routingKey来决定是否要把消息放入对应的队列中。有两种表达式符号可以让我们选择:#和*。一个附带特殊的选择键将会被转发到绑定键与之匹配的队列中。需要注意的是:关于绑定键有两种特殊的情况。
1。* 可以匹配一个标识符。
2。# 可以匹配0个或多个标识符。
注意一个标识符不是一个字母,每一个标识符之间都是用小数点【.】来区分的,比如abc.bvc.ggg这串字符串有3个标识符。
声明exchange channel.exchangeDeclare(exchange, “topic”); 发布消息 channel.basicPublish(exchange, routingKey, null, msg 消费端绑定 channel.queueBind(queue, exchange, “kernel.*”); 接收消息 channel.basicConsume(queue, true, consumer);
Headers:发送者在发送的时候定义一些键值对,接收者也可以再绑定时候传入一些键值对,两者匹配的话,则对应的队列就可以收到消息。匹配有两种方式all和any。
这两种方式是在接收端必须要用键值”x-mactch”来定义。all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了。
声明exchange channel.exchangeDeclare(exchange,ExchangeTypes.HEADERS,false,true,null); 发布消息 Map headers = new Hashtable(); headers.put(“aaa”, “01234”); Builder properties = new BasicProperties.Builder(); properties.headers(headers); channel.basicPublish(exchange,”“,properties.build(),message.getBytes()); 消费端绑定 channel.queueDeclare(queue,false, false, true,null); Map headers = new Hashtable(); headers.put(“x-match”, “any”);//all any headers.put(“aaa”, “01234”); headers.put(“bbb”, “56789”); channel.queueBind(queue, exchange,”“, headers); 接收消息 channel.basicConsume(QUEUE_NAME, true, consumer);
- RabbitMQ的路由机制
- .Net下RabbitMQ的使用(4) -- 路由机制
- RabbitMQ学习总结(6)——消息的路由分发机制详解
- RabbitMQ 路由
- RabbitMQ的消息路由基本讲解
- SIP的路由机制
- Cowboy的路由机制
- SIP的路由机制
- nodejs的路由机制
- Magento的路由分发机制
- AngularJs ng的路由机制
- Web Api 的 路由机制
- 走进AngularJs的路由机制
- Web Api 的 路由机制
- Web Api 的 路由机制
- rabbitmq(四) Routing(路由)
- RabbitMQ之路由选择
- RabbitMQ Routing(路由选择)
- 排序算法 -- (四)堆排序
- 近期我将51CTO的博客搬家到了CSDN的问题
- 有两个升序的的数组A1和A2,内存在A1末尾有足够的多余空间容纳A2,设计一个函数,把A2中的所有数字插入到A1中并且所有的数字都是升序的。
- d3 Integration——d3集成
- PHP生成图像验证码的方法小结(2种方法)
- RabbitMQ的路由机制
- 建议使用TextureView替代SurfaceView
- enable cef support ffmpeg
- 安装docker-compose
- Java文件名规则与 main
- ionic2 tab切换控制
- 第一篇博客,天下武功
- TopK问题——统计大家最爱玩的游戏
- VideoView播放视频异常MediaPlayer: Error (1,-2147483648)