rabbitmq之一---消息队列基础

一,前言                                                              

                                                                           

大家好,我是小墨,这期博客会以rabbitmq作为消息队列的代表来概述rabbitmq如何实现消息队列的功能。前后会更新几期希望能够将我在学习和使用rabbitmq的过程学到的内容尽量讲解全。

  1. rabbitmq基础
  2. rabbitmq消息可靠性

二,消息队列简介

消息队列中间件在项目中常用的三个功能为:异步、削峰、解耦,这几个都比较好理解,不加赘述,更详细可参考:消息队列基础,但是会使项目更加的复杂,相对不可靠,需要用户去尽量保证功能的可靠性。

我们可以尝试和常用的rpc如dubbo比较:

  1. 由于可能存在网络,应用稳定性,所以重试机制是必须要有的,只不过消息队列需要先把消息存到broker,所以分出消费端重试和生产端重试
  2. dubbo也可以实现像callback此类的异步实现,这个异步还是类似的。
  3. 我们在使用rpc时要定义好这个调用方法的前后传参,消息队列也如此,需要定义好消息队列格式便于存与取
  4. 最主要区别还是在于消息队列多出了个broker作为第三方可以用于存储消息,分发消息。

另外我们举常用的三种消息队列rabbitmq,rocketmq,kafka进行比较

 

特性 RabbitMQRocketMQkafka
开发语言 erlangjavascala
单机吞吐量 万级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代码书写规则,参考下图:

  1. 初始化:创建交换器,队列。制定交换器和队列之间的绑定规则
  2. 消费者:定义消息内容,制定对应的路由键发送给broker
  3. 消费者:监听对应的队列,等待拉取对应的消息

 

四,总结

本文主要讲述rabbitmq的基础知识,下一章我们主要针对如何实现消息队列传递消息,分发消息的可靠性来进行讲述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值