RabbitMQ篇(基本介绍)

news2024/11/26 5:35:54

目录

一、MQ

1. 什么是MQ

2. 为什么要用MQ【业务场景】

2.1. 异步

2.2. 应用解耦

2.3. 流量削峰

3. MQ的分类

(1)ActiveMQ

(2)Kafka

(3)RocketMQ

(4)RabbitMQ

4. MQ 的选择

二、RabbitMQ

1. 简介

2. 作用

3. AMQP协议

AMQP核心概念

4. 工作原理

5. 工作模式

(1)普通模式

(2)Worker模式

(3)PubSub模式

(4)Rounting模式

(5)Topic模式

(6)RPC模式

(7)Publisher Confirms模式


一、MQ

1. 什么是MQ

MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队 列中存放的内容是

message 而已,还是一种跨进程的通信机制,用于上下游传递消息。 在互联网架构中,MQ 是一种非常常见的上

下游“逻辑解耦+物理解耦”的消息通信服 务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他

服务。

2. 为什么要用MQ【业务场景】

2.1. 异步

如: 用户注册发送,注册邮件、注册短信

传统做法 :

(1)、串行 (先发送邮件、再发短信)。问题:持续时间长

(2)、并行(将注册信息写入数据库后,同时发送邮件、短信),速度快、但不能满足高 吞吐需求

消息队列做法 :

将数据写入数据库、同时发送消息给发送邮件和注册,异步处理

2.2. 应用解耦

如:双十一购物节,用户下单后、订单系统通知库存系统。

传统做法 :

订单系统调用库存系统接口。问题:库存接口故障,订单就会失败,而损失大量订单

消息队列做法

订单系统:下单,订单系统完成持久化,将消息写入队列,返回下单成功给用户 库存系统:订阅下单的消息,获

取下单消息,进行库操作,就算库存系统故障,消息队 列也能保证消息可靠投递,不会导致消息丢失。

2.3. 流量削峰

如:秒杀活动、一般会因为流量过大,导致应用挂掉,一般在应用前端加入消息队列。 作用: 1、可以控制活动

人数,超过一定阈值,订单直接丢弃 2、可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取

订单)

3. MQ的分类

(1)ActiveMQ

优点:单机吞吐量万级,时效性 ms 级,可用性高,基于主从架构实现高可用性, 消息可靠性较高,概率丢失数

据低

缺点: 官方社区现在对 ActiveMQ 5.x 维护越来越少,高吞吐量场景较少使用。

(2)Kafka

大数据的杀手锏,谈到大数据领域内的消息传输,则绕不开 Kafka,这款为大数据 而生的消息中间件, 以其百万

级 TPS 的吞吐量名声大噪,迅速成为大数据领域的宠 儿,在数据采集、传输、存储的过程中发挥着举足轻重的作

用。目前已经被 LinkedIn, Uber, Twitter, Netflix 等大公司所采纳。

优点: 性能卓越,单机写入 TPS 约在百万条/秒,最大的优点,就是吞吐量高。时 效性 ms 级可用性非常高,

kafka 是分布式的,一个数据多个副本,少数机器宕机,不 会丢失数据,不会导致不可用,消费者采用 Pull 方式获

取消息, 消息有序, 通过控制能够 保证所有消息被消费且仅被消费一次; 有优秀的第三方Kafka Web 管理界面

KafkaManager;在日志领域比较成熟,被多家公司和多个开源项目使用;功能支持: 功能较 为简单,主要支持

简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使 用

缺点:Kafka 单机超过 64 个队列/分区,Load 会发生明显的飙高现象,队列越多, load 越高,发送消息响应时

间变长,使用短轮询方式,实时性取决于轮询间隔时间,消 费失败不支持重试;支持消息顺序, 但是一台代理宕

机后,就会产生消息乱序,社区更 新较慢;

(3)RocketMQ

RocketMQ 出自阿里巴巴的开源产品,用 Java 语言实现,在设计时参考了 Kafka, 并做出了自己的一些改进。

被阿里巴巴广泛应用在订单,交易,充值,流计算,消息推 送,日志流式处理,binglog 分发等场景。

优点: 单机吞吐量十万级, 可用性非常高,分布式架构, 消息可以做到 0 丢失, MQ 功能较为完善,还是分布式的,

扩展性好, 支持 10 亿级别的消息堆积,不会因为堆积导 致性能下降, 源码是 java 我们可以自己阅读源码,定制自

己公司的 MQ

缺点:支持的客户端语言不多,目前是 java 及 c++,其中 c++不成熟;社区活跃度 一般,没有在MQ核心中去实

现 JMS 等接口,有些系统要迁移需要修改大量代码

(4)RabbitMQ

2007 年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息 系统,是当前最主流的消息

中间件之一。

优点: 由于 erlang 语言的高并发特性,性能较好;吞吐量到万级,MQ 功能比较完 备,健壮、稳定、易用、跨平

台、支持多种语言 如:Python、Ruby、.NET、Java、 JMS、C、PHP、ActionScript、XMPP、STOMP 等,支

持 AJAX 文档齐全;开源提供 的管理界面非常棒,用起来很好用,社区活跃度高;

更新频率相当高 https://www.rabbitmq.com/news.html

缺点:商业版需要收费,学习成本较高

4. MQ 的选择

(1)Kafka

主要特点是基于Pull 的模式来处理消息消费,追求高吞吐量,一开始的目的 就是用于日志收集和传输,适合产生

大量数据的互联网服务的数据收集业务。大型公司 建议可以选用,如果有日志采集功能, 肯定是首选 kafka 了。

(2)RocketMQ

天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣 款,以及业务削峰,在大量

交易涌入时,后端可能无法及时处理的情况。RoketMQ 在 稳定性上可能更值得信赖,这些业务场景在阿里双 11

已经经历了多次考验,如果你的 业务有上述并发场景,建议可以选择 RocketMQ。

(3)RabbitMQ

结合 erlang 语言本身的并发优势,性能好时效性微秒级,社区活跃度也比较高,管 理界面用起来十分方便,如果

你的数据量没有那么大,中小型公司优先选择功能比较完 备RabbitMQ。

二、RabbitMQ

1. 简介

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。

最初起源于金融系统,适用于对数据的一致性、稳定性和可靠性要求比较高的场景。

2. 作用

缓解高并发场景的压力;对流量进行削峰;实现解耦;提高系统的可靠性

3. AMQP协议

AMQP高级消息队列协议(Advanced Message Queueing Protocol),是面向消息的中间件的开放标准应用层

协议,AMQP的特征是消息导向,排队,路由(包括点对点和发布和订阅),可靠性和安全性。

AMQP要求消息传递提供商和客户端的行为在不同供应商实现可互操作的情况下,以与SMTP,HTTP,FTP等相

同的方式创建了可互操作的系统。

AMQP协议是具有现代特征的二进制协议。一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协

议的一个开发标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中

间件不同产品,不同开发语言等条件的限制。

AMQP是一种二进制应用层协议,旨在有效地支持各种消息应用和通信模式。

AMQP核心概念

AMQP协议模型

Server

又称作Broker,用于接受客户端的连接,实现AMQP实体服务;

Connection

连接,应用程序与Broker的网络连接;

Channel

网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表

一个会话任务;

Message

消息,服务器和应用程序之间传送的数据,有Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则是消息体内容,即我们要传输的数据;

仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定

只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立

和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP

连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程之间不要共用Channel,至少要保

证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection。

Virtual Host

虚拟地址,是一个逻辑概念,用于进行逻辑隔离,是最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,

同一个Virtual Host里面不能有相同名称的Exchange或者Queue;

Virtual Host是权限控制的最小粒度;

Exchange

交换机,用于接收消息,可根据路由键将消息转发到绑定的队列;

Binding:

Exchange和Queue之间的虚拟连接,Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着

Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,

Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding

Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定

Routing Key:

一个路由规则,虚拟机可用它来确定如何路由一个特定的消息;

Queue:

也称作Message Queue,即消息队列,用于保存消息并将他们转发给消费者;

RabbitMQ整体架构图

4. 工作原理

Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker

Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚 拟的分组中,类似于网络中的

namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每

个用户在自己的 vhost 创建 exchange/queue 等

Connection:publisher/consumer 和 broker 之间的 TCP 连接

Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候 建立 TCP Connection 的开

销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常

每个 thread 创 建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message

broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻 量级的Connection 极大减少了操作

系统建立 TCP connection 的开销

Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到

queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)

Queue:消息最终被送到这里等待 consumer 取走

Binding:exchange 和queue 之间的虚拟连接,binding 中可以包含 routing key, Binding 信息被保存到

exchange 中的查询表中,用于 message 的分发依据

简单来说:

1、生产者发送消息到MQ交换机

2、交换机根据定义的绑定规则和传过来的key将消息放到不同队列中

3、消费者从队列中取出消息进行消费

5. 工作模式

让我们看看官网:https://www.rabbitmq.com/tutorials/tutorial-one-java#hello-world

经过官网文档介绍,我们知道RabbitMQ的工作模式有七种

Hello Wold 简单模式/普通模式

Work queues 工作队列模式

Publish/Subscribe 发布订阅模式

Routing 路由模式

Topics 主题模式

RPC 远程调用模式

Publisher Confirms 发布确认模式

(1)普通模式

(2)Worker模式

类似于RocketMQ集群模式,发送消息只有一个消费者去消费。prefetchCount默认预取250个

消息,可以在配置文件中配置预取消息数量,实现各个节点多劳多得。消费速度快的就可以消费更多的消息。

spring.rabbitmq.listener.simple.prefetch=自定义预取数量

(3)PubSub模式

类似于RocketMQ广播模式,所有消费者都会收到消息。

生产者需要指定交换机,不需要指定队列。type ="fanout"

(4)Rounting模式

根据指定的交换机及路由key来发送消息,

即消费者绑定了与生产者发布的消息相同的路由key时才可以收到消息。

(5)Topic模式

Rounting模式的一种,交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

(6)RPC模式

远程过程调用RPC

(7)Publisher Confirms模式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02 1. APM: Large Language Model Agent-based Asset Pricing Models Authors: Junyan Cheng, Peter Chin https://arxiv.org/abs/2409.17266 APM: 基于大型语言模型的代理资产定价模型(LLM Agent-b…

2、项目配置设计(上)

文章目录 前言一、配置文件功能需求二、web工程设计思路三、Config实现思路 前言 配置文件作用:把需要经常修改的参数,从代码中分离出来,单独管理,方便后期维护。 开发一个web应用,肯定需要一些基础性的配置信息,这些信…

骨架屏 (懒加载优化)

骨架屏 (懒加载优化) 即便通过 Webpack 的按需加载、CDN 静态资源缓存 和 代码分割 等技术来减少首屏的代码体积,首屏加载时的白屏时间(也称为首屏等待时间)仍然可能存在,尤其在网络条件较差或页面内容复杂…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类,使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

基于Springboot vue应急物资供应管理系统设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

【硬件模块】HC-SR04超声波模块

HC-SR04超声波模块实物图 工作参数 探测距离&#xff1a;2~600cm 探测精度&#xff1a;0.1cm1% 感应角度&#xff1a;<15 输出方式&#xff1a;GPIO 工作电压&#xff1a;DC 3~5.5V 工作电流&#xff1a;5.3mA 工作温度&#xff1a;-40~85℃ 引脚接线 HC-SR04MCU备注VC…

Golang | Leetcode Golang题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }

04-SpringBootWeb案例(下)

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询&#xff08;今天完成&#xff09;带条件的分页查询&#xff08;今天完成&#xff09;删除员工&am…

Pikachu-Sql Inject-数字型注入(GET)

一、、破解 SQL 查询语句中的字段数 ?id1 order by 3 -- // -- 是注释&#xff0c; 加号 在MySQL中会转成空格 order by 1 &#xff0c;by 数字几&#xff0c;就是按照第几列进行排序&#xff1b;如果没有这一行&#xff0c;则报错 如&#xff1a;以下语句&#xff0c;根据…

QT学习笔记1(QT和QT creator介绍)

QT学习笔记1&#xff08;QT和QT creator介绍&#xff09; Qt 是一个跨平台的应用开发框架&#xff0c;主要用于图形用户界面&#xff08;GUI&#xff09;应用的开发&#xff0c;但也支持非GUI程序的开发。Qt 支持多种平台&#xff0c;如Windows、macOS、Linux、iOS和Android&a…

Servlet的生命周期及用户提交表单页面的实现(实验报告)

一、实验目的、要求 1. 掌握Servlet的定义&#xff0c;即Servlet是运行在服务器端的Java程序&#xff0c;用于扩展服务器的功能。 2. 学习和掌握在开发环境中搭建Servlet应用所需的工具&#xff0c;如Tomcat服务器、IDEA等。 二、实验内容 根据本章所学知识&#xff0c;实验…

linux第一课:下载与安装

这是我的个人复习笔记&#xff0c;草稿箱字太多会卡就发这了&#xff0c;欢迎大家阅读。 Kali Linux&#xff0c;黑客必备神器。跟着我&#xff0c;带你从入门到入狱&#xff01; 第一课&#xff0c;下载与安装。 第一步&#xff1a; 在官网下载Centos镜像&#xff1a;http…

(2025)408考研:王道操作系统文件管理强化

写在最前面,需要pdf的请资源里下载,已经排版好了,这里不知道为什么粘贴上来排版这么难看!!! 某一个分区进行格式化的时候,这个分区的文件系统就被建立了,一旦这个文件系统建立完后,就确定了文件系统使用的什么样的物理结构。 操作系统引导: 主存分为两部分,RAM和RO…

人体目标检测数据集 18000张 人体 带标注voc yolo

人体目标检测数据集 18000张 人体 带标注voc yolo 继续 人体目标检测数据集介绍 数据集名称 人体目标检测数据集 (Human Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型&#xff08;包括YOLOv5、YOLOv6、YOLOv7等&#xff09;而设计&#…

vue-cli老项目继续优化:json压缩神器 compress-json

前言 上文讲到一个 vue-cli 带脚本生成内容的老项目的打包时间已经从 40min &#xff0c;优化到 12min &#xff0c;再到 9min 。 还有可以考虑的方式包含缩小脚本体积、依赖分包、构建的缓存等等。 那么本文就来讨论缩小脚本体积的方式。 分析 前文已知&#xff0c;生成的…

螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)

如果要搭建基于docker的私人DC&#xff0c;除了虚拟机网络连接外&#xff0c;就得掌握docker的网络连接。磨刀不误砍柴工&#xff0c;或者说工欲善其事必先利其器&#xff0c;我们先学学典型的docker的网络连接方式。Docker的网络连接有四种&#xff1a;bridge、none、containe…

jmeter学习(2)变量

1&#xff09;用户定义的变量 路径&#xff1a;添加-》配置元件-》用户定义的变量 用户定义的变量是全局变量&#xff0c;可以跨线程组被调用&#xff0c;但在启动运行时获取一次值&#xff0c;在运行过程中不再动态获取值。 2&#xff09;用户参数 路径&#xff1a;…

扩展可持续性概念:太空移民、持久产品与人类未来

可持续性的扩展概念&#xff1a;超越绿色能源&#xff0c;关乎人类未来的延续 当我们听到“可持续性”这个词时&#xff0c;大多数人首先想到的是环境保护、绿色能源、减少碳足迹或保护生态系统。虽然这些都是不可忽视的重要部分&#xff0c;但可持续性远远超出了绿色能源的范…

RabbbitMQ篇(环境搭建 - 下载 安装)(持续更新迭代)

目录 一、Windows 1. 下载安装程序 2. 安装配置erlang 3. 安装rabbitMQ 4. 验证 二、Linux 1. 下载rpm包 1.1. 下载Erlang的rpm包 1.2. 下载socat的rpm包 1.3. 下载RabbitMQ的rpm包 2. 安装 2.1. 安装Erlang 2.2. 安装socat 2.3. 安装RabbitMQ 3. 启动RabbitMQ服…

酒店生态发展旅游四个一体化建设-—未来之窗行业应用跨平台架构

一、酒店在旅游中的作用 首先&#xff0c;酒店为游客提供了舒适的住宿环境。经过一天的游玩&#xff0c;游客需要一个干净、安全、设施齐全的空间休息&#xff0c;恢复精力&#xff0c;以更好地继续后续的行程。 其次&#xff0c;酒店是旅游服务的重要载体。它不仅提供住宿&am…