Rabbitmq学习笔记

Rabbitmq学习笔记

零、什么是消息队列

    在微服务或者分布式系统中,两个或者多个服务之间通信或者一个服务发出消息需要通知给多个服务处理的时候,消息队列是一个很好的解决方案。

    AMQP : Advanced Message Queuing Protocol 高级消息队列协议,是应用层协议的一个开放标准,为面向消息中间件设计。

    何为消息中间件:消息中间件就是用于解决多个服务或者组件之间通信但是各服务之间却不需要知晓发送消息和接收消息的是谁,这样也做到了服务和模块之间的解耦。

一、Rabbitmq又是个啥?

    RabbitMq是一个消息代理中间件,用于接收和转发消息,按照官方文档的解释,可以把兔子看成一个邮局,它做着和邮局一样的事情。就是接收到消息发送方发出的消息,然后根据收件信息(路由名称)将信息推送给消费者;

二、Rabbitmq的主要核心概念

Rabbitmq具有以下几个核心概念
     0、消息生产者(producer):顾名思义,消息生产者就是产生消息并且将消息发送出来的一方,
     1、消息接收者(消费者)(consumer):接收消息并消费的一方
     2、队列(Queue):队列,这里的队列是RabbitMq的内部对象,用于存储消息,RabbitMq的消息都存储在Queue中,然后推送给消费者
     三者关系如下图
3、信道(Channel):用于客户端与RabbitMq服务器连接通信的通道,由于RabbitMq服务与客户端之间的连接是需要一条基于TCP连接的长连接,所以Channel是建立在Connection上的一条虚拟连接,RabbitMq所需要处理的每条消息以及指令都需要通过Channel完成,每个Channel都会被指派一个唯一的ID,之所以建立并使用信道,是因为为了减少创建Connection(TCP连接)。
4、交换机(Exchange)和BindingKey(绑定键):绑定键是用于将交换机与队列建立绑定关系所实现的。消息的接受以及发送则需要通过交换机来根据交换机规则进行消息的推送以及处理
交换机的几种类型:
fanout: 扇形交换机,全方位无差别轰炸,只要是绑定在交换机的消费者均可收到消息,就是这么豪横。
direct: 直连交换机,精准打击,这里是精准找到与消息指定的RoutingKey完全匹配的消费者们(们:这里的消费者可以是多个RoutingKey匹配的消费者)进行推送。形象点如果把性别看作RoutingKey,厕所看作交换机,每个进厕所的人看作队列,而“向前一小步,文明一大步”看作消息的话,那么只有RoutingKey是男的队列(人们)才可以接收到这则消息。
topic:规则交换机,就是该交换机下所有绑定的路由,只要符合消息的RoutingKey规则,则就都可以接收到消息的推送如:我发送的RoutingKey是 sky.nt.lueluelue 则,消息队列绑定的RoutingKey为:>sky...nt. 以及 ..lueluelue等一次类推的所有队列都可以接收到消息推送。
headers:头信息交换机,这个交换机就比较骚了。为啥呢?因为这个交换机不通过RoutingKey来匹配。他是通过消息的Header(头信息)中的某一属性来进行匹配的,当队列与交换机进行绑定的时候,指定一组> 键值对;当发送消息的时候在头信息里面放入这个键值对,则就会接收到消息,反之这接收不到。不过一般都没啥人用,属于核弹级别,看起来很吊,就是没人敢用或者说没有场景来用。
5、消息的持久化(Message acknowledgment):为了避免由于服务器宕机而导致的消息丢失,RabbitMq实现了消息的持久化功能,所谓的消息持久化就是将Rabbitmq服务器内存里面的数据如:交换机、队列、消息存储在硬盘中,以防服务器宕机或者损坏所造成的数据丢失。
Rabbitmq 持久化方式分为如下几种:
0、交换机(Exchange)持久化:在创建交换机的需要指定durableTrue表示开启持久化。
1、队列(Queue)持久化:在创建队列时指定durableTrue即可。
2、消息(Message)的持久化:如果需要开启消息的持久化,则需要将消息的deliveryMode设置成为2即代表消息持久化。但是由于消息会被写入到硬盘,所以对Rabbitmq的性能也是会影响的,而且消息持久化并不能保证消息百分百的不丢失,万一你往磁盘写的时候断电了,或者服务器炸了,消息还是会丢失的。
(注:持久化是各管各的,持久化了交换机就只能持久化交换机,交换机里面的队列还是会丢失的,所以这俩要开就都开。至于消息的话,其实可以考虑存入缓存或者数据库等地方实现持久化)

6、RPC(RPC):消息的回调,因为消息队列是基于异步的消息处理,并且根据消息队列特性,发送者并不知道消费者具体是谁,更别说是否消费成功了,但是在某些时候或者应用场景上面,我们是需要判断这条消息发送出去后是否处理成功了,这个时候我们就用上了Rabbitmq的RPC机制了

Rabbitmq RPC具体实现方法:

在消息的属性(MessageProperties)中,设置两个值:
0、replyTo:这里写需要回调的路由名称,在消息在处理完成以后将会发送消息队列到这个指定的消息中。
1、CorrelationId:当前请求的唯一标识,用于区分消息。

三、死信队列

    Rabbitmq如果出现长时间没有人消费的、被拒绝接收的,队列达到最大长度以后进入队列的,都被称为死信,而死信所归往的地方就被称为死信队列,死信队列与其他队列有何不同呢?并没有什么不同,只不过消息变成死信后会经由死信交换机发送到死信队列上面,然后由死信队列的消费者去处理这些队列。
//下面是复制的:
    那么“死信”被丢到死信队列中后,会发生什么变化呢?如果队列配置了参数 x-dead-letter-routing-key 的话,“死信”的路由key将会被替换成该参数对应的值。如果没有设置,则保留该消息原有的路由key。

    举个栗子:

    如果原有消息的路由key是testA,被发送到业务Exchage中,然后被投递到业务队列QueueA中,如果该队列没有配置参数x-dead-letter-routing-key,则该消息成为死信后,将保留原有的路由keytestA,如果配置了该参数,并且值设置为testB,那么该消息成为死信后,路由key将会被替换为testB,然后被抛到死信交换机中。

    另外,由于被抛到了死信交换机,所以消息的Exchange Name也会被替换为死信交换机的名称。

四、参考链接:

0、 https://www.cnblogs.com/williamjie/p/9481774.html
1、https://www.jianshu.com/p/5c2d8af2c78e
2、https://www.cnblogs.com/eleven24/p/10326718.html
3、https://www.rabbitmq.com/documentation.html
4、https://juejin.cn/post/6844904039193280526
5、https://www.cnblogs.com/mfrank/p/11184929.html
6、https://www.cnblogs.com/williamjie/p/9481774.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容