RabbitMQ是一个消息队列,和Kafka以及阿里的ActiveMQ从属性来说,干的都是一回事。消息队列的主要目的实现消息的生产者和消费者之间的解耦,支持多应用之间的异步协调工做html
因为工做缘由,接触和使用rabbitmq做为生产环境下的消息队列,所以准备写一些博文,记录下这个过程当中的收货;而开篇除了环境搭建以外,就是对于其内部的基本概念进行熟悉和了解了。git
基础环境搭建能够参考: 《RabbitMq基础教程之安装与测试》github
本文则主要集中在如下几点:服务器
<!-- more -->异步
首先来一张消息队列的经典图,能够划分为三个角色: Producer, Queue, Consumer学习
看到这个模型,若是对JDK的容器有必定的了解,很容易能够想到借助 ArrayBlockingQueue
或者 ListBlockingQueue
就能够实现简易的消息队列(也就是咱们常说的生产者-消费者模型)测试
其实在生活中,这种模型用得很是多,就好比咱们都会接触的网购快递,能够说是一个典型的消息队列的case了:编码
商家不断的把商品扔给快递公司(注意不是直接将商品给买家),而快递公司则将商品根据地质分发对应的买家加密
对上面这个过程进行拆解,能够映射扮演的角色.net
那么快递公司时怎么知道要把商品给对应的买家呢?根据包裹上的地址+电话
经过上面的实例对比,发现基本的消息队列定义的元素太少,这里则正好能够看一下RabbitMQ是怎么具体来实现消息队列的
上面是一些专业的概念,那么能够怎么映射到前面的快递上呢?
生产者,将消息投递给Exchange,而后由Exchange将消息路由到对应的Queue上,供消费者消费,那么这个路由有哪些方式呢?
消息中的路由键(routing key)若是和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中
简单来说,就是路由键与队列名彻底匹配
举例说明
Exchange和两个队列绑定在一块儿:
从上图也能够看出,这种策略,将忽略所谓的routing key,将消息分发到全部绑定的Queue上,更加相似咱们理解的广播模式
topic 交换器经过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列须要绑定到一个模式上
能够理解为直接策略的进阶版,直接策略是彻底精确匹配,而topic则支持正则匹配,知足某类指定规则的(如以xxx开头的路由键),能够键消息分发过去
#
匹配0个或多个单词*
匹配很少很多一个单词一个更直观的实例以下
Producer发送消息时须要设置routing_key,
test.orange.mm
消息,则会路由到Q1;而若是是 test.orange
则没法路由到Q1,由于Q1的规则是三个单词,中间一个为orange,不知足这个规则的都无效test.qq.rabbit
或者 lazy.qq
均可以分发到Q2;即路由key为三个单词,最后一个为rabbit或者不限制单词个数,主要第一个是lazy的消息,均可以分发过来test.orange.rabbit
消息,则Q1和Q2均可以知足这个实际上用得很少,它是根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,若是Header信息和message消息的头信息相匹配
主要使用的消息分发策略有三个,直接,路由和扇形,简单的小结下应用场景和区别
直接彻底匹配模式,适用于精准的消息分发
Routing Key的匹配模式,支持Routing Key的模糊匹配方式,更适用于多类消息的聚合
忽略Routing Key, 将消息分配给全部的Queue,广播模式,适用于消息的复用场景
消息队列的一个重要指标,当有消费者获取了消息以后,对这个消息我应该怎么办?是直接删除仍是等某个合适的机会再删除?又或者是干脆不删除,就留着了?
在实际的应用场景中,消息正常消费以后,咱们但愿的是这个消息就不要了,可是消费的过程当中若是出现了bug,则但愿不要删除消息,等我修复这个bug后,能够把这个消息从新的投递给我
Consumer接收到了消息以后,必须返回一个ack的标志,表示消息是否成功消费,若是返回true,则表示消费成功了,而后这个消息就会从RabbitMQ的队列中删掉;若是返回false,且设置为从新入队,则这个消息能够被从新投递进来
一般实际编码中,默认是自动ACK的,若是消息的重要性程度较高,咱们应该设置为主动ACK,在接收到消息以后,自主的返回对应的ACK信息
这一块更多地内容能够查看实际使用篇
一灰灰的我的博客,记录全部学习和工做中的博文,欢迎你们前去逛逛
尽信书则不如,已上内容,纯属一家之言,因我的能力有限,不免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激