提示:这里可以添加学习目标
1、 RabbotMQ构架与实战
2、 RabbitMQ高级特性解析
3、RabbitMQ集群与运维
4、 RabbitMQ源码剖析
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
RabbitMQ常用的交换器类型有: fanout 、 direct 、 topic 、 headers 四种。
会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中
direct类型的交换器路由规则很简单,它会把消息路由到那些BindingKey和RoutingKey完全匹配的队列中,如下图:
topic类型的交换器在direct匹配规则上进行了扩展,也是将消息路由到BindingKey和RoutingKey相匹配的队列中,这里的匹配规则稍微不同,它约定:
BindingKey和RoutingKey一样都是由"."分隔的字符串;BindingKey中可以存在两种特殊字符“”和“#”,用于模糊匹配,其中"“用于匹配一个单词,”#"用于匹配多个单词(可以是0个)。
headers类型的交换器不依赖于路由键的匹配规则来路由信息,而是根据发送的消息内容中的headers属性进行匹配。在绑定队列和交换器时指定一组键值对,当发送的消息到交换器时,RabbitMQ会获取到该消息的headers,对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果匹配,消息就会路由到该队列。headers类型的交换器性能很差,不实用。
持久化消息会保存到磁盘,并且保存一部分到内存。当内存吃紧时才会释放一部分内存提高性能。非持久化会保存在内存当中,当内存不够时会保存到到磁盘,节省空间。
Hello World一对一的简单模式。生产者直接发送消息给RabbitMQ,另一端消费。未定义和指定Exchange的情况下,使用的是AMQP default这个内置的Exchange。
生产者和消费者需要与RabbitMQ建立TCP连接,也就是Connection。TCP连接建立起来的时候客户端会被建立一个信道(channel),每个信道一个ID。
生产者发消息,启动多个消费者实例来消费消息,每个消费者仅消费部分信息,可达到负载均衡的效果。
连接RabbitMQ的时候需要一个新的,空的队列。其次断开消费者的连接,该队列应该自动删除。
String queueName = channel.queueDeclare().getQueue();
这样声明了一个非持久化、排他的、自动删除的队列,并且名字是服务器随机生成的。queueName一般的格式类型:
amq.gen-JzTY20BRgKO-HjmUJj0wLg 。
在创建队列和fanout交换器之后,我们需要将两者进行绑定,让交换器将消息发送该队列。
channel.queueBind(queueName, "logs", "");
这时交换器会接受到消息追加到我们的队列中,并且使用下面命令列出绑定关系:
rabbitmqctl list_bindings
使用 direct 类型的Exchange,发N条消费并使用不同的 routingKey ,消费者定义队列并将队列、 routingKey 、Exchange绑定。此时使用 direct 模式Exchagne必须要 routingKey 完全匹配的情况下消息才会转发到对应的队列中被消费。路由模式就可以让接受者接收部分信息。
上一模式中,交换器的使用方式:
channel.queueBind(queueName, EXCHANGE_NAME, "");
绑定语句还有第三个参数:routingKey
channel.queueBind(queueName, EXCHANGE_NAME, "black");
bindingKey 的作用与具体使用的交换器类型有关。对于 fanout 类型的交换器,此参数设置无效,系统直接忽略。
使用direct交换器可以对日志进行不同处理:只需要将消息的rountingkey和队列的bingingkey相对应,消息就可以推送给队列。
上图中的交换器 X 是 direct 类型的交换器,绑定的两个队列中,一个队列的 bindingKey 是orange ,另一个队列的 bindingKey 是 black 和 green 。如此,则 routingKey 是 orange 的消息发送给队列Q1, routingKey 是 black 和 green 的消息发
送给Q2队列,其他消息丢弃。
上图中,我们使用 direct 类型的交换器 X ,建立了两个绑定:队列Q1根据 bindingKey 的值black 绑定到交换器 X ,队列Q2根据 bindingKey 的值 black 绑定到交换器 X ;
交换器 X 会将消息发送给队列Q1和队列Q2。交换器的行为跟 fanout 的行为类似,也是广播。
topic类型的交换器背后原理和direct类型的类似,只要队列的bingingKey的值与消息的routingKey匹配,队列就可以收到该消息。有两个不同点:
提示:接下来将继续介绍其高级特性