一,前言
大家好,我是小墨,这期博客会以rabbitmq作为消息队列的代表来概述rabbitmq如何实现消息队列的功能。前后会更新几期希望能够将我在学习和使用rabbitmq的过程学到的内容尽量讲解全。
二,消息队列简介
消息队列中间件在项目中常用的三个功能为:异步、削峰、解耦,这几个都比较好理解,不加赘述,更详细可参考:消息队列基础,但是会使项目更加的复杂,相对不可靠,需要用户去尽量保证功能的可靠性。
我们可以尝试和常用的rpc如dubbo比较:
- 由于可能存在网络,应用稳定性,所以重试机制是必须要有的,只不过消息队列需要先把消息存到broker,所以分出消费端重试和生产端重试
- dubbo也可以实现像callback此类的异步实现,这个异步还是类似的。
- 我们在使用rpc时要定义好这个调用方法的前后传参,消息队列也如此,需要定义好消息队列格式便于存与取
- 最主要区别还是在于消息队列多出了个broker作为第三方可以用于存储消息,分发消息。
另外我们举常用的三种消息队列rabbitmq,rocketmq,kafka进行比较
特性 | RabbitMQ | RocketMQ | kafka | |
---|---|---|---|---|
开发语言 | erlang | java | scala | |
单机吞吐量 | 万级 | 10万级 | 10万级 | |
社区活跃度 | 最活跃 | 阿里支持,不活跃 | 比较活跃 | |
可用性 | 高(主从架构) | 非常高(分布式架构) | 非常高(分布式架构) | |
功能特性 | 基于erlang开发,所以并发能力很强,性能极其好,延时很低;管理界面较丰富
| MQ功能比较完备,扩展性佳 | 只支持主要的MQ功能,像一些消息查询,消息回溯等功能没有提供,毕竟是为大数据准备的,在大数据领域应用广。 |
我们可以从比较中,理性认为,中小型公司,不需要极其大的消息分发量可以使用rabbitmq更方便,支持度更高,当然如果向大数据,日志这方面肯定kafka更合适,大公司的话有专门的消息中间件运维也可以选用rocketMq,像我之前在的一家手机大厂就去年开始推广公司替换rabbitmq为rocketmq。
三,rabbitmq基础
rabbitmq是实现AMQP消息队列协议的一种消息队列,
包括的要素 :
- 生产者、消费者、消息
- 信道
- 交换器、队列、绑定、路由键
架构如图:
注意rabbitmq中的broker,vhost概念:
- Broker: 接收和分发消息的应用,RabbitMQ Server就是Message Broker。
- Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
然后重要一点:消费者收到的每一条消息都必须进行确认(自动确认和自行确认)
一,交换器exchange
exchange分类:
1,fanout:群发给所有绑定到该exchange上的队列,
2,direct:如果消息的routingKey 和对应的队列绑定的routing key相等时exchange分发到该队列,常用于相同应用多实例之间的任务分发。这种类型也是默认的rabbitmq exchange 类型。
3,topic:通过可配置的规则分发给绑定在该exchange上的队列,主要使用路由键*和#,官方文档解释的很好:
- * (star) can substitute for exactly one word.
- # (hash) can substitute for zero or more words.
我们举例:路由规则我们设置为三段 *.*.*,每个*代表一段规则,那么*.orange.*则代表第一段和第三段规则随意匹配,只要第三个路由键为orange即可。而lazy.#则代表只要第一段规则为lazy,剩余两段规则随意匹配。
4,headers :当分发规则很复杂,用routing key不好表达时适用,忽略routing key,用header取代之,header可以为非字符串,例如Integer或者String,很少用
二,绑定队列
我们可以理解exchange作为一个proxy用于如何分发消费者生成的消息进入制定队列,所以关键一步还在于我们绑定对应的交换器和队列。
队列我们都知道规则是先入先出,这里不多加详解。
所以可以知道rabbitmq代码书写规则,参考下图:
- 初始化:创建交换器,队列。制定交换器和队列之间的绑定规则
- 消费者:定义消息内容,制定对应的路由键发送给broker
- 消费者:监听对应的队列,等待拉取对应的消息
四,总结
本文主要讲述rabbitmq的基础知识,下一章我们主要针对如何实现消息队列传递消息,分发消息的可靠性来进行讲述。