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远程调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417998.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python知识宝库】迭代器与生成器:高效处理大数据集

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、迭代器:逐个访问数据的艺术1. 迭代器的定义2. 自定义迭代器3. 迭代器的优势 二、生成器&#xff…

分布式风电电池储能系统

风能作为一种清洁的可再生能源,越来越受到世界各国的*视。但风能随机波动的特点,造成风电出力的频繁波动,使电网的调频、调峰压力加大,成为长期困扰风电并网的主要难题。 我国的弃风限电*次出现于2010年,此后弃风从零星现象快速扩散,2012年的情况*为严*,弃风率达17%。之后随着…

VueSax-解决Vue3报错问题,并支持typescript

以下为坑点 根据官方提示,本人在vue3typescript的项目中添加了vuesax的组件依赖 根据正常的导入依赖思路编写代码,发现typescript一直报 查询vuesax的目录文件发现存在ts文件,于是乎觉得是自己的问题,就查阅gpt与网上资料&#x…

【学习笔记】SSL证书安全机制之证书撤销

前言:以往提到过,钓鱼网站会仿冒我们,如果我们的私钥泄露了,如果被不法分子得到了私钥,他们就能假装是我们网站。那现在,我们要做的是生成新私钥并申请新证书。问题来了,旧的证书亦然存在且有效…

sql-labs51-55通关攻略

第51关 一.查询数据库 1and updatexml(1,concat(0x7e,(select database()),0x7e),1)-- 二.查表 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase() ),0x7e),1) -- 三.查列 and updatexml(1,concat…

如何利用mHand Pro动捕数据手套连接虚拟与现实?

数据手套作为虚拟现实中的一种交互动捕设备,能够模拟真人手部的动作和感知反馈,实现人机交互的效果。随着虚拟现实技术的不断发展,数据手套也在不断地改进和升级。 mHand Pro是一款由拥有多年经验的惯性动作捕捉技术团队广州虚拟动力研发的数…

Java并发编程实战 04 | 使用WaitNotify时要注意什么?

在 Java 中,wait()、notify() 和 notifyAll() 方法在多线程编程中主要用于线程间的协作和同步。理解这些方法的使用特点对于编写稳定的多线程程序至关重要。我们将从以下三个问题入手深入探讨它们的使用: 为什么必须在 synchronized 代码块中使用 wait(…

gazebo可能打不开的问题

如果经常遇到gazebo只能断网才能运行的时候,主要就是因为无法联网访问gazebo的在线模型库,此时我们一般无法在联网的情况下打开gazebo。 这个时候就直接将下载好的模型先放到~/.gazebo/models/文件夹下面即可: https://github.com/osrf/gazeb…

大语言模型(LLM)如何更好地继续预训练(Continue PreTraining)

预训练(Pretraining)是一个非常消耗资源的工作,尤其在 LLM 时代。随着LLama2的开源,越来越多人都开始尝试在这个强大的英文基座模型上进行中文增强。但,我们如何才能保证模型在既学到「中文知识」的情况下,…

简单的EasyCaptcha图片验证码学习

简单的EasyCaptcha图片验证码学习 1. 需求 图片验证码是一种常见的验证形式,它通过生成一串随机数字或符号,并加入一些干扰像素,最终生成用于验证的图片。这种验证码的设计旨在增加破解难度,主要通过加大干扰强度来提高安全性。…

vue3 element-plus form 表单 循环校验

需求: 表单是循环出来的,3个一组,每组对于前端来说是一样的, 需要校验输入框是否必填是否为小数或者整数 效果: 未输入--显示:请输入 输入不是小数或整数--显示:请输入整数或小数 输入正确…

Vue - 关于Router路由跳转时显示的animate.css动画

Vue - 关于Router路由跳转时显示的animate.css动画 在Vue中,操作路由跳转时页面是闪白的,没有动画效果,我们可以通过在router-view中设置transition,并搭配animate丰富的动画效果来美化路由跳转时的显示效果. 1.安装animate np…

Java使用类加载器解决类冲突,多版本jar共存

Java使用类加载器解决类冲突 1、案例说明2、打包新版本POI并将要调用的方法封装2.1、POM文件2.2、封装的方法 3、要使用多个POI版本的项目3.1、打包前面的项目生成一个jar包3.1、POM文件3.2、类加载器代码3.3、Jar加载工具3.4、最终调用 1、案例说明 项目中已经有了一个旧版本…

奖项再+1!通义灵码智能编码助手通过可信 AI 智能编码工具评估,获当前最高等级

阿里云的通义灵码智能编码助手参与中国信通院组织的可信AI智能编码工具首轮评估,最终获得 4 级评级,成为国内首批通过该项评估并获得当前最高评级的企业之一。 此次评估以《智能化软件工程技术和应用要求 第 2 部分:智能开发能力》为依据&…

别给智能猫砂盆花冤枉钱了!这三款好用智能猫砂盆哪个更好用?

节假日回老家,不方便带猫咪怎么办?而且猫咪这么能拉,猫砂盆里拉满了又怎么办?猫砂盆一满,就会变脏,变脏了小猫就会抗拒上厕所,从而在家里找其他干净的地方排泄,那我们要怎么保证不在…

python中 if __name__ == “__main__“的代码没被执行

运行pytest 和unittest时,if name “main”: 下的代码没有被执行,发现__name__等于模块名 一、“name” 的作用 1、 __name__是python的一个内置类属性,它天生就存在于一个 python 程序中。 2、直接运行python程序时,__name__的…

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX…

提升效率!ArcGIS中创建脚本工具

在我们日常使用的ArcGIS中已经自带了很多功能强大的工具,但有时候遇到个人的特殊情况还是无法满足,这时就可以试着创建自定义脚本工具。 一、编写代码 此处的代码就是一个很简单的给图层更改别名的代码。 1. import arcpy 2. input_fc arcpy.GetParam…

针对不同区域的摄像头,完成不同的算法配置的智慧快消开源了

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…

js逆向--cai招网

js逆向--cai招网 一、寻找加密入口1、抓包2、关键字搜索寻找加密入口二、调试js三、python代码实现一、寻找加密入口 1、抓包 目标数据来源网址为:https://search.bidcenter.com.cn/search?keywords=%E5%85%AC%E5%85%B1%E4%BD%8F%E5%AE%85,打开开发者工具进行抓包。 目标…