RabbitMQ简介

RabbitMQ简介

MQ

百度百科-MQ

MQ:Message Queue 消息队列

# 何为消息队列?
消息:字符串,数字,对象,文件...... 业务中需要用到的数据都可以称为消息
队列:先进先出的数据结构
  • 常用来解耦异步消息流量削峰,实现高性能,高可用,可伸缩,最终一致性,常用于分布式系统中
  • 常见产品,RabbitMQ,RocketMQ,ActiveMQ,ZeroMQ,Kafka

解耦

在分布式系统中,A系统直接远程调用B系统,如果B系统宕机了,那么A系统调用不了,也提供不了服务

如果A和B之间引用了消息队列C,A系统将消息发送到消息队列C中,再由B系统去消息队列中订阅,那么即使B系统宕机,我们的数据还保存在中间件C上,等B系统服务再启动的时候,再去消费信息

假设订单系统调用的不止一个库存系统,还调用了支付系统,物流系统,那么如果后期再加一个评分系统,那么就得修改订单系统的代码,不符合开闭原则,如果使用了消息队列,只要再加一个评分系统订阅消息队列即可

image-20210810103433364

异步消息

假设用户注册之后,需要发送短息和发送邮件双重验证,

如果以传统串行的方式,将注册信息写入到数据库中 2 秒,先发送短信,成功之后再发送邮件,成功之后返回信息给客户端,可能加起来需要7秒

如果以并行的方式,将注册信息写入到数据库中 2 秒,发送邮件3秒,加起来可能要5秒

如果以中间件的方式,将注册信息写入到数据库中 2 秒,写入到消息队列中 1 秒,这时就可以返回信息给用户了,加起来只要 3秒,而后面的发送短信和发送邮件,由各自的系统去订阅消息队列,各自处理

image-20210810104759624

image-20210810104851912

image-20210810104926168

流量削峰

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。

应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。

之前架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。

但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。

引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。

系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。

这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。

我们在此计算一下,每秒在MQ积压3000条消息,1分钟会积压18万,1小时积压1000万条消息,高峰期过后,1个多小时就可以将积压的1000万消息消费掉。

image-20210810105846803

生产者和消费者

生产者 → 消息队列 ← 消费者

生成者生产消息,投递到消息队列中

消费者订阅消息队列,消费消息

缺点

  • 引入新的框架,导致系统复杂度变高,MQ宕机怎么办
  • 消息丢失,消息重复消费,消息传递

常见的消息队列

RabbitMQ
  • 开源

  • 基于 Erlang 语言开发

  • 基于 AMQP(高级消息队列协议) 标准实现

  • 支持语言众多,Python,Java,C,Ruby,.NET,PHP等

  • 持久化

RocketMQ
  • 阿里开源
  • 纯 Java 开发
  • 高吞吐,高可用,适合大规模分布式系统
  • 由于是阿里内部产物,很多接口和 api 不是普遍适用
ActiveMQ
  • Apache 出品
  • 与 Spring 容易整合
  • 支持语言众多,Python,Java,C,Ruby,.NET,PHP等
ZeroMQ
  • 号称史上最快的消息队列
  • 类似 Socket,普通 Socket 是端对端 1:1,而 ZeroMQ 是 N:N 的关系
  • 支持语言众多,Python,Java,C,Ruby,.NET,PHP等
  • 非持久化
Kafka
  • 高吞吐量,每秒百万级的数据
  • 支持 Hadoop 并行数据加载,常用于大数据生态中
  • 持久化
对比
特性RabbitMQActiveMQRocketMQKafka
公司RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
消息延迟微秒毫秒毫秒毫秒
单机吞吐万级(3)万级(4)十万级(1)十万级(2)
多语言支持支持Java支持Java支持Java支持Java
协议AMQP,SMTP,STOMP,XMPPAMQP,STOMP,REST,XMPP,OpenWire自定义自定义,http
社区社区活跃社区活跃较差大数据相关

RabbitMQ

百度百科-RabbitMQ

RabbitMQ 官网

  • 基于 Erlang 语言,Eralng 专门为高并发和分布式而设计的一种语言

RabbitMQ 基础架构

image-20210810132705855

  • Producer 生产者
    • 投递消息的一方,将消息发布到 RabbitMQ 中
  • Consumer 消费者
    • 接收消息的一方,订阅队列,消费消息
  • Broker 服务节点
    • 可以将一个 RabbitMQ Broker 看做一台 RabbitMQ 服务器
  • Connection 连接
    • 生产者连接 broker,消费者连接 broker
    • TCP 连接
  • Channel 通道
    • 每次访问 RabbitMQ 都建立一个 Connection的话,会很耗费性能,好比不停的创建线程,服务器的性能都浪费在创建,和销毁上了,所以使用线程池,维护多个线程,同理,Connection 内部也维护了多个 channel,如果需要连接,只要连接 channel 即可,减少了连接的开销
    • 每个 channel 独立
  • Virtual Host 虚拟机
    • 不同用户使用同一个队列的话,张三建立一个名为 aaa 的交换机和消息队列,李四也建立一个名为 aaa 的交换机和消息队列???会冲突
    • 多个不同用户使用头一个 RabbitMQ server 时,可以划分多个 Virtual Host,每个用户在自己的 vhost 里创建 exchange 和 queue
  • Exchange 交换机
    • 消息到达队列时,先到达交换机,通过交换机的路由规则分配到某一个具体队列
    • direct
    • topic
    • fanout
  • Queue 队列
    • 生产者的消息会被送到这里等待
    • 等待消费者取走消费
  • Binding 绑定
    • 交换机和队列之间的连接
    • 交换机和队列按照什么路由绑定

工作模式

工作模式

  • 简单模式
  • 工作队列 WorkQueue
    • 轮询
    • 公平分发
  • 发布订阅 Publish/Subscribe
    • fanout
  • 路由模式 Routing
    • direct
  • 主题模式 Topics
    • topic
  • RPC远程调用
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ是一个开源的消息中间件,用于在应用程序之间传递消息。它使用AMQP(高级消息队列协议)作为消息传递的标准协议。在实际应用中,可以使用RabbitMQ来实现消息的生产和消费。 要实现一个RabbitMQ实战demo,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Erlang和RabbitMQ。你可以使用命令`rabbitmq-server -detached`来启动RabbitMQ服务,并使用`rabbitmqctl status`来查看服务状态。如果需要关闭服务,可以使用`rabbitmqctl stop`命令。 2. 在你的应用程序中,添加RabbitMQ的配置信息。你可以在应用的配置文件中添加以下内容: ``` spring.application.name=springboot-rabbitmq spring.rabbitmq.host=192.168.217.128 spring.rabbitmq.port=5672 spring.rabbitmq.username=developer spring.rabbitmq.password=dev123456 spring.rabbitmq.virtual-host=/ spring.rabbitmq.listener.direct.acknowledge-mode=manual ``` 其中,`spring.rabbitmq.host`是RabbitMQ的IP地址,`spring.rabbitmq.port`是RabbitMQ的端口号,`spring.rabbitmq.username`和`spring.rabbitmq.password`是RabbitMQ的用户名和密码,`spring.rabbitmq.virtual-host`是RabbitMQ的虚拟主机,`spring.rabbitmq.listener.direct.acknowledge-mode`是消息的确认模式。 3. 在你的应用程序中,编写生产者和消费者的代码。生产者负责发送消息到RabbitMQ,消费者负责接收并处理消息。你可以根据你的需求来编写相应的代码逻辑。 4. 运行你的应用程序,并测试RabbitMQ的功能。你可以通过发送消息到RabbitMQ来测试生产者的功能,然后通过消费者来接收并处理这些消息。 这是一个简单的RabbitMQ实战demo的步骤,你可以根据你的具体需求来进行相应的修改和扩展。希望对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [RabbitMQ 实战](https://blog.csdn.net/weixin_58026642/article/details/121486694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [《RabbitMQ 实战指南》第一章 RabbitMQ 简介](https://blog.csdn.net/qq_45593575/article/details/122155110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值