MQ选型及RocketMQ架构总览

一、什么是MQ

MQ(MessageQueue)
Message(消息):消息是在不同进程之间传递的数据,这些进程可以在同一台机器上,也可以在不同的机器上。
Queue(队列):队列原意是指一种具有FIFO(先进先出)特性的数据结构,是用来缓存数据的。
我们要学习的MQ产品对接的使用对象是应用程序。
它是一种在应用程序之间传递消息的通信方式,通过将消息发送到中间件(消息队列)来实现解耦和异步处理。消息队列允许发送者将消息放入队列中,而接收者可以从队列中获取消息进行处理。这种方式可以提高系统的可靠性、扩展性和灵活性,同时降低系统之间的依赖性和耦合度。常见的消息队列系统有RabbitMQ、Apache Kafka、RocketMQ。

二、MQ有什么作用

MQ的主要作用包括:

  1. 异步通信:通过消息队列,发送者和接收者之间的通信可以变为异步方式,发送者将消息放入队列后即可继续处理其他任务,而不需要等待接收者的响应。这能提高系统响应时间
    在这里插入图片描述

  2. 解耦合:使用消息队列可以将不同模块或服务之间的耦合度降低。发送者只需要将消息发送到队列中,而不需要关心具体的接收者是谁,接收者也可以从队列中获取消息进行处理,而不需要知道消息的来源。当下游服务出现问题无法提供服务时,不会影响到上游服务继续提供服务,这一点在分布式系统中尤为重要。
    在这里插入图片描述

  3. 缓冲和削峰:当发送者产生大量请求时,消息队列可以作为缓冲区,暂时存储这些请求,然后由接收者按照自己的处理能力逐个处理。同时,当请求过多导致系统压力过大时,消息队列可以平滑地削峰,避免系统崩溃或性能下降。
    在这里插入图片描述

三、MQ介绍及选型

在这里插入图片描述

RabbitMQ

  • 遵从AMQP协议
    AMQP简单来说就是规定好了MQ的各个抽象组件,使得很好被开源框架所集成,比如Spring AMQP专门就是用来操作AMQP架构的中间件的,因此RabbitMQ可以被Spring Boot很方便的集成。
  • 丰富的消费模型:Fanout(广播)、direct(精确路由)、topic(模糊路由)
  • 消息延迟低(微秒级)
  • 吞吐量不高
  • 使用erlang语言,使得其根据业务进行二次开发的成本比较高

RocketMQ

RocketMQ出自阿里公司的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进,消息可靠性上比 Kafka 更好。RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。

  • 天生的分布式架构
  • 消息可靠性和吞吐量都很高,以及丰富的消息消费模式使他适用于大多数业务场景

Kafka

Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log),之后成为Apache项目的一部分。Kafka系统快速、可扩展并且可持久化。它的分区特性,可复制和可容错都是其不错的特性。

  • Kafka的设计目标是实现高吞吐量的消息传递,适用于处理大量的实时数据流。
  • 支持的消费模式比较单一

具体企业开发中使用如何呢?

Kafka 一开始的目的就是用于日志收集和传输,适合有大量数据产生的互联网业务,特别是大数据领域的实时计算、日志采集等场景,用 Kafka 绝对没错,社区活跃度高,业内标准。

RocketMQ 特别适用于金融互联网领域这类对于可靠性要求很高的场景,比如订单交易等,而且 RocketMQ 是阿里出品的,经历过那么多次淘宝双十一的考验,大品牌,在稳定性值得信赖。但如果阿里不再维护这个技术了,社区有可能突然黄掉的风险。因此如果公司对自己的技术实力有自信,基础架构研发实力较强,推荐用 RocketMQ。

RabbitMQ 适用于公司对外提供能力,可能会有很多主题接入的中台业务场景,毕竟它是百万级主题数的。它的时效性是毫秒级的,但实际毫秒级和微秒级在感知上没有什么太大的区别,所以它的这一大优点并不太会作为考量标准。同时,它的功能是比较完善的,开源社区活跃度高,能解决开发中遇到的bug,所以万级别数据量业务场景的小公司可以优先选择功能完善的RabbitMQ。它的缺点就是用 Erlang 语言编写,所以很多开发人员很难去看懂源码并进行二次开发和维护,也就是说对于公司来说可能处于不可控的状态。

RocketMQ的核心部分概述

生产者(Producer)

RocketMQ生产者是消息的发送方,用于向RocketMQ中的主题发布消息。生产者负责将消息发送到指定的主题,并将消息传递给订阅该主题的消费者进行消费。

消费者(Consumer)

RocketMQ消费者是消息的接收方,用于从RocketMQ中的主题订阅消息并进行消费。消费者负责从指定的主题中拉取消息或者监听队列,然后对消息进行处理。

消费者组(ConsumerGroup)

  • 为了消费能力的水平扩展,ConsumerGroup的概念应运而生。

RocketMQ消费者组是一组具有相同消费逻辑的消费者实例的集合。在RocketMQ中,一个主题可以由多个消费者组进行订阅和消费。
消费者组的主要作用是实现消息的负载均衡和容错能力。当一个主题有多个消费者组时,RocketMQ会将该主题的消息分配给各个消费者组进行处理。每个消费者组内的消费者实例则共同承担该组内消息的消费任务。这样做的好处是能够提高消息的消费速度和并发处理能力。

主题(Topic)

  1. 标识消息分类:RocketMQ的主题用于对消息进行分类和组织。通过为不同类型的消息分配不同的主题,可以使消息更具可读性和可管理性。
  2. 独立的消息队列:每个主题都有自己的消息队列,用于存储该主题下的消息。每个队列都可以并行地接收和处理消息,从而实现高吞吐量和负载均衡。
  3. 消息路由:生产者在发送消息时指定目标主题,消费者则通过订阅感兴趣的主题来接收对应的消息。RocketMQ根据主题将消息路由到相应的队列上,然后再由消费者消费。

在这里插入图片描述

NameServer

RocketMQ的NameServer是一个用于管理和维护消息队列的元数据信息的组件。它是RocketMQ的核心组件之一,负责记录每个Topic的路由信息和Broker的状态信息。

Broker

在RocketMQ中,Broker是消息队列的核心组件之一。它负责存储和转发消息,并提供消息的发布和订阅功能。他是一个物理概念,你可以认为他是一个服务节点。

MessageQueue

定义: 队列是 Apache RocketMQ 中消息存储和传输的实际容器,也是 Apache RocketMQ 消息的最小存储单元。 Apache RocketMQ 的所有主题都是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储。

为了消息写入能力的水平扩展,RocketMQ 对 Topic进行了分区,这种操作被称为队列(MessageQueue)。

对于RocketMQ同一个消费者组下的多个consumer需要与topic下的messagequeue建立对应关系,而一个messagequeue只能被一个consumer进行消费。因此增加的Conusmer实例最多也只能和Topic下的MessageQueue数量相等,如果继续增加就会有消费者空闲。
[图片]

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

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

相关文章

python与java的区别

java老程序员来学习python了,记录一下两种类型语言的区别: Python与Java变量类型对比 python里面定义变量不需要指定变量的数据类型,并且是可以修改成其他类型java里面定义变量要指定变量的数据类型,指定以后不可以修改成其他数据…

固件签名技术深度解析:HSM模块如何守护设备安全,CAS系统如何赋能产业升级

引言:数字时代的固件安全危机 在万物互联的今天,全球设备固件安全事件频发:某汽车品牌因固件漏洞导致百万车辆被远程控制,某医疗设备厂商因固件篡改引发数据泄露,某工业控制系统因非法固件升级造成生产线瘫痪……这些…

修改Typora快捷键

代码 的默认快捷键为: 这对我来说不太友好,太难按了,而且我电脑右边的Ctrl键坏了,这意味着我只能一个左手去按这3个键的组合,这更是难上加难了,于是想到改一下快捷键,代码块 是Ctrl Shift K&…

Bellman-Ford算法(详解版)

Bellman-Ford算法 Bellman-Ford算法是用来解决,对于有负权的图的**单源最短路径**.因为DJ算法不可以解决对于负权的图,所以使用这个算法来求解.但是依旧不可以有负回路.因为负回路就没有存在单源最短路径这一说. BF的另一个重要的用途就是用来检测**是不是存在负回路** 思路…

《HarmonyOSNext的ForEach数组渲染の核心玩法与避坑指南》

《HarmonyOSNext教学宝典:ForEach数组渲染全攻略与性能优化》 #HarmonyOS开发 #ArkTS实战 #组件解析 🎯 ForEach组件完全指南:数组循环渲染核心机制 举个栗子🌰: ForEach相当于智能印刷机,将数组元素自动转…

单片机 - STM32F407 ADC 模式详解:单次转换、连续转换、扫描模式、非扫描模式

STM32F407 ADC 模式详解:单次转换、连续转换、扫描模式、非扫描模式 前言 在 STM32F407 中,ADC(模数转换器)模块常用于采集模拟信号,比如读取光敏电阻、电压、电流、温度传感器等。STM32 的 ADC 模式较多&#xff0c…

开源模型应用落地-工具使用篇-从零开始搭建Qdrant Web UI-可视化管理工具-Windows(十)

一、前言 Qdrant 是一个高性能的向量搜索引擎,广泛应用于相似性搜索、推荐系统和大规模数据检索等场景。虽然其原生 API 提供了强大的功能,但对于开发者和运维人员来说,缺乏直观的可视化界面常常增加了使用门槛。为了解决这一问题&#xff0c…

高频交易技术:订单簿分析与低延迟架构——从Level 2数据挖掘到FPGA硬件加速的全链路解决方案

高频交易技术:订单簿分析与低延迟架构——从Level 2数据挖掘到FPGA硬件加速的全链路解决方案 一、引言:高频交易的技术本质 1.1 速度即利润的微观战场 数据揭示:据NYSE实测,每降低1微秒延迟可获得年化$700-1500万套利窗口&#…

基于生成对抗网络(GAN)的图像生成与编辑:原理、应用与实践

前言 生成对抗网络(GAN)是近年来深度学习领域中最具影响力的技术之一。自2014年由Ian Goodfellow等人首次提出以来,GAN已经在图像生成、图像编辑、风格转换等多个领域取得了令人瞩目的成果。GAN的核心思想是通过生成器(Generator&…

pytorch基本运算-梯度运算:requires_grad_(True)和backward()

引言 前序学习进程中,已经对pytorch基本运算中的求导进行了基础讨论,相关文章链接为: 导数运算pytorch基本运算-导数和f-string-CSDN博客 实际上,求导是微分的进一步计算,要想求导的前一步其实是计算微分&#xff1…

idea64.exe.vmoptions配置

这个idea64.exe.vmoptions文件是用于配置 IntelliJ IDEA(64位版本)运行时的 Java 虚拟机(JVM)参数。这些参数直接影响到 IDEA 的性能、内存使用、调试能力和行为。 下面是对文件中每一行配置的详细解读: -Xms2048m 作…

齐次变换矩阵相乘的复合变换:左乘与右乘的深度解析

在三维几何变换中,齐次变换矩阵相乘是实现复杂变换的核心方法。本文将通过一个包含四个变换步骤的完整示例,深入探讨齐次变换矩阵左乘和右乘的区别,并结合 Python sympy 库的代码实现,详细阐述变换过程和结果差异。 二维齐次坐标的旋转变换 在二维齐次坐标系中,一个点可以…

5g LDPC编译码-LDPC编码

目录 1、LDPC编码基础知识 2、5g的LDPC编码 2.1 LDPC分块: 2.2 LDCP编码 2.3 校验位的产生 1、LDPC编码基础知识 LDPC属于线性分组码,线性分组码的基本知识如下: 编码后的码字是由初始二进制序列与生成矩阵在二进制域相乘后得到,生成矩阵与校验矩阵,校验矩阵与编码后…

OpenVINO使用教程--resnet分类模型部署

OpenVINO使用教程--resnet分类模型部署 本节内容模型准备推理测试分析&总结本节内容 OpenVINO 根据AI技术类型将部署任务分成传统模型模型部署和生成式AI模型部署,传统模型指的是各种CNN小模型,这部分部署只需要OpenVINO包,具体安装教程可以参考之前的章节:OpenVINO环境…

无字母数字webshell的命令执行

在Web安全领域,WebShell是一种常见的攻击手段,通过它攻击者可以远程执行服务器上的命令,获取敏感信息或控制系统。而无字母数字WebShell则是其中一种特殊形式,通过避免使用字母和数字字符,来绕过某些安全机制的检测。 …

C++斯特林数在C++中的数学理论与计算实现1

一、 斯特林数概述 1.1 组合数学中的核心地位 斯特林数(Stirling Numbers)是组合数学中连接排列、组合与分划问题的核心工具,分为两类: 第一类斯特林数(Stirling Numbers of the First Kind)&#xff1a…

[C++] STL大家族之<map>(字典)容器(附洛谷)

map-目录 使用方法头文件与声明定义基本操作 使用方法 头文件与声明定义 头文件是: #include <map>我们这样声明一个字典: map</*key_type*/, /*value_type*/> /*map_name*/; // 例子: map<int, char> mp;这里稍作解释: key_type是你每个键值对中的键的…

使用 Flutter 在 Windows 平台开发 Android 应用

以下是完整的开发流程&#xff0c;包括环境搭建、代码实现和应用发布&#xff0c;帮助你开发一个具有地图显示、TCP 通信功能的 Android 应用。 一、环境搭建 1. 安装 Flutter SDK 从 Flutter 官网 下载最新稳定版 SDK解压到本地目录&#xff08;如 D:\flutter&#xff09;添…

【模板】埃拉托色尼筛法(埃氏筛)

一、算法简介 在数论与编程竞赛中&#xff0c;求解 [ 1 , n ] [1,n] [1,n] 范围内的所有质数是常见的基础问题。埃拉托色尼筛法&#xff08;Sieve of Eratosthenes&#xff09; 是一种古老而高效的算法&#xff0c;可以在 O ( n log ⁡ log ⁡ n ) O(n \log \log n) O(nlogl…

AI Agent实战 - LangChain+Playwright构建火车票查询Agent

本篇文章将带你一步步构建一个智能火车票查询 Agent&#xff1a;你只需要输入自然语言指令&#xff0c;例如&#xff1a; “帮我查一下6月15号从上海到南京的火车票” Agent就能自动理解你的需求并使用 Playwright 打开 12306 官网查询前 10 条车次信息&#xff0c;然后汇总结果…