RabbitMQ从入门到精通

目录

一.RabbitMQ概述

1.消息队列的优点

2.消息队列的缺点

3.MQ如何选型

二.RabbitMQ的重要概念

1.Publisher

2.Message

3.Exchange

4.BindingKey

5.Routingkey

6.Routingkey和BindingKey的区别

7.Queue

8.Consumer

9.Connection

10.Channel

11.Virtual Host

12.Broker

三.RabbitMQ发送和接收消息步骤

1.发送消息的步骤

2.消费者接收消息

四.RabbitMQ的四种交换机

1.直连交换机(Direct exchange)

2.扇形交换器(Fanout exchange)

3.主题交换器(Topic exchange)

4.头信息交换器(Headers exchange)

五.RabbitMQ的六种工作模式

1.simple简单模式

2.work工作模式 (竞争关系)

3.publish/subscribe发布订阅(共享资源)

4.routing路由模式

5.topic 主题模式(路由模式的一种)

6.远程过程调用(RPC)

总结

六.Springboot集成RabbitMQ

1.生产者搭建

2.消费者

一.RabbitMQ概述
1.消息队列的优点
(1)应用解耦

    用户下单成功后,短信通知用户。这个发短信的功能可以使用mq实现。

(2)异步

    用户下单后,立马返回订单详情。发短信是异步的。

(3)流量削峰

    当下单用户量达到40W/s,但是我们业务处理能力只有20W/s,剩余20W可以放到mq中慢慢处理。mq起到一个缓冲的作用。

2.消息队列的缺点
(1)系统可用性降低

    消息队列在系统中充当一个中间人的身份,如果该中间人突然失联了,那其他两方就不知所措了,最后也就导致系统之间无法互动。

(2)系统复杂性提高

    在使用消息队列的过程中,难免会出现生产者、MQ、消费者宕机不可用的情况,那么随之带来的问题就是消息重复、消息乱序、消息堆积等等问题都需要我们来控制。

(3)消息一致性问题

    如下图所示,系统需要保证快递投递,扣减系统费,通知等之间的数据一致性,如果系统短信通知,快递通知执行成功,扣减系统费执行失败时,就会出现数据不一致问题

3.MQ如何选型
(1)各种MQ选型分析

    RabbitMQ:erlang开发,对消息堆积的支持并不好,当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。每秒钟可以处理几万到十几万条消息。

    RocketMQ:java开发,面向互联网集群化功能丰富,对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,每秒钟大概能处理几十万条消息。

    Kafka:Scala开发,面向日志功能丰富,性能最高。当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高。所以,Kafka 不太适合在线业务场景。

(2)个人建议

    中小型公司,技术一般,可以考虑用 RabbitMQ;

    大型公司,基础架构研发实力较强,用 RocketMQ 是很好的选;

    实时计算、日志采集:使用 kafka。

(3)应用场景

    详见我的另一篇博客:https://blog.csdn.net/qq_45443475/article/details/119934030?spm=1001.2014.3001.5502

二.RabbitMQ的重要概念
1.Publisher
消息发布者 (或称为生产者) 负责生产消息并将其投递到指定的交换器上。

2.Message
消息由消息头和消息体组成,消息头用于存储与消息相关的元数据:如目标交换器的名字 (exchange_name) 、路由键 (RountingKey)和其他可选配置 (properties) 信息。消息体为实际需要传递的数据。

3.Exchange
交换器负责接收来自生产者的消息,并将消息路由到一个或者多个队列中,如果路由不到,则返回给生产者或者直接丢弃,这取决于交换器的 mandatory 属性。

    mandatory = true时, 如果交换器路由不到队列,则会将该消息返回给生产者。

    mandatory = false时, 如果交换器路由不到队列,则会直接丢弃该消息。

4.BindingKey
交换器与队列通过 BindingKey 建立绑定关系。

5.Routingkey
基于交换器类型的规则相匹配时,消息被路由到对应的队列中。

6.Routingkey和BindingKey的区别
String routingKey = “class.sex” ;// 消息的路由键,例如一班.李四

    String bindingKey = "*.李*"; // 队列绑定的接收规则, 列如只收李姓

7.Queue
消息队列载体,每个消息都会被投入到一个或多个队列。

    用于存储路由过来的消息,多个消费者可以订阅同一个消息队列,此时队列会将收到的消息将以轮询 (round-robin) ​ 的方式分发给所有消费者,即每条消息只会发送给一个消费者,不会出现一条消息被多个消费者重复消费的情况。

8.Consumer
消费者订阅感兴趣的队列,并负责消费存储在队列中的消息。为了保证消息能够从队列可靠地到达消费者,RabbitMQ 提供了消息确认机制 (messageacknowledgement),并通过 autoAck 参数来进行控制。

autoAck=true 此时消息发送出去 (写入TCP套接字) 后就认为消费成功,而不管消费者是否真正消费到这些消息。当 TCP 连接或 channel 因意外而关闭,或者消费者在消费过程之中意外宕机时,对应的消息就丢失。因此这种模式可以提高吞吐量,但会存在数据丢失的风险。

autoAck=false 需要用户在数据处理完成后进行手动确认,只有用户手动确认完成后ÿ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值