当前位置: 首页 > article >正文

消息队列(kafka 与 rocketMQ)

  • 为什么要使用消息队列?
      • 作用1: 削峰填谷(突发大请求量问题)
      • 作用2: 解耦(单一原则)
      • 作用3: 异步(减少处理时间)
  • 如何选择消息队列(kafka&RocketMQ)
      • 成本
      • 功能
      • 性能
      • 选择
  • rocketMQ是参考kafka进行实现的为什么rocketMQ与kafka性能差距很大呢?
      • kafka 的底层数据储存实现
      • rocketMQ 的底层数据储存实现
      • 零拷贝实现的差异
        • 原始的发送流程
        • kafka使用的sendfile模式
        • rocketMQ的mmap模式
        • mmap与sendfile的差异
      • 为什么rocketMQ不使用分区分开储存而要使用混合储存的方式?
        • rocketMQ针对大topic支持的调整

为什么要使用消息队列?

作用1: 削峰填谷(突发大请求量问题)

case1:

  • 聊天(比如 QQ ,微信): 在过年的前后的短时间内QPS差距非常大
  • 过年前(23:59:59): QPS 只有1万
  • 过年后(00:00:00): QPS 会超过 10 万;所有人都在疯狂的发送"新年快乐"这样的新年祝福
  • 这时服务器不可能承受瞬间超过平时 10 倍的压力

这时就可以使用消息队列:

  • 将消息存在消息队列中
  • 按照服务能够消费的速度进行消费
  • K8S的弹性伸缩,当压力太大时会自动拓展服务器,加快处理能力;当压力降低会收缩服务器降低成本(k8s 的弹性伸缩也需要时间,如果没有消息队列做削峰填谷,还没有拓展服务器服务就被打爆了)
  • 当压力变小后: 将拓展的服务器杀掉,节约成本

作用2: 解耦(单一原则)

case1:

  • 用户登录: 关联的功能非常多(token 颁发,消息推送,活动的推荐,计算在线时长等)
  • 如果全部做在登录的api 中:登录的代码可能超过几千行,开发困难,并且难以维护.

原则是一次只做一件事

  • 登录就只颁发 token
  • 将登录的消息存在消息队列中
  • 与登录相关的其他服务(消息推送,活动的推荐,计算在线时长等)订阅登录的消息,然后做进一步的操作

作用3: 异步(减少处理时间)

  • 用户登录: 关联的功能非常多(token 颁发,消息推送,活动的推荐,计算在线时长等)
  • 要自信的任务非常多,执行时间久(用户等待时间长)

使用消息队列进行异步处理

  • 完成关键业务(获取 token,消息放入消息队列)就可以返回
  • 服务器后台再逐渐执行其他业务(消息推送,活动的推荐,计算在线时长等),不需要等所有服务执行完成,减少用户等待时间.

如何选择消息队列(kafka&RocketMQ)

成本

按阿里云的计费标准
kafka: 标准版 60MB/s 读写; 500GB 磁盘: ¥1,189.75 /月
RocketMQ: (按每条消息 100 字节算)15000TPS 的61,710/月

两个吞吐量性能相似,价格相差 50 多倍

功能

  • kafka: 提供基本的消息队列的功能(生产与消费)
    具体可以查阅 kafka 官方文档或者 sdk 的 api

RocketMQ: 提供了更加丰富的功能

  1. 消息的种类: 提供普通消息;顺序消息,延时消息,事务消息 4 种
  2. 生产: 提供普通的 send 与 request 两种模式
  3. 消费: 提供了 push 与 pull 两种模式,同时提供消息过滤功能

具体可以查阅 RocketMQ 官方文档或者 sdk 的 api

性能

  • kafka




  • RocketMQ





根据测试结果来看
kafka : 发送 25MB/s; 接收400MB/s(最高情况)
RocketMQ: 发送:12MB/s;接收 20MB/s

总结:

  • kafka 可以达到 100w QPS
  • RocketMQ 大概是 20w QPS

选择

  • 首先考虑 kafka(普通消息传输:case IM): 成本低,性能好等诸多优势
  • 如果kafka无法满足使用的功能需求(比如需要事务,或者延时发布等功能: case: 支付/订单等功能):再考虑使用 RocketMQ.

rocketMQ是参考kafka进行实现的为什么rocketMQ与kafka性能差距很大呢?

kafka 的底层数据储存实现

  • kafka 的数据是进行分区储存的,每一个分区对应单独的文件夹(数据,索引都是单独的),这样在并发(多生产者与消费者)读写的情况下性能更好(特别是读)
  • 可以减少并发读写的冲突问题
  • 在读的情况下,可以更好的使用批量读取的方式获取数据,提升读取性能

rocketMQ 的底层数据储存实现

  • rocketMQ 的 index 的分开储存的,但是数据(message)是混合储存的,所有 topic 的所有分区的数据都是储存一起的.
  • 这样使得 rocketMQ 在并发的条件下读写性能略逊一筹
  • 并发写会有更多冲突
  • 在读取的时候,每次需要通过索引映射数据,更加麻烦,不利于批量读取

零拷贝实现的差异

原始的发送流程
  • 磁盘数据->内核空间->用户空间->socket 发送缓冲区->网卡

  • 数据经历了 4 次拷贝

kafka使用的sendfile模式
  • 磁盘数据->内核空间->网卡

  • 数据经历了 2 次拷贝

rocketMQ的mmap模式
  • 磁盘数据->内核空间->socket 发送缓冲区->网卡
  • 数据经历了 3 次拷贝
mmap与sendfile的差异
  • mmap:数据会先存在 socket 发送缓冲区中,再发送;方便做重试等功能

  • sendfile: 只关心发送了几个字节,不关心发送的内容

  • rocketMQ 需要做重试与二次消费,所以选择了 mmap 的模式

为什么rocketMQ不使用分区分开储存而要使用混合储存的方式?

我没有在文档与书籍中看到为什么 rocketMQ 要使用混合储存的方式,但是我在探究他们的不同的时候发现 kafka 存在分区数量庞大(10000+)会导致性能下降的问题.

  • 原因 1: zookeeper 维护了每一个分区的元数据,当分区非常大的时候 zookeeper 压力很大
    在这里插入图片描述
  • 原因 2:操作系统持有文件句柄数量是有限的,文件数量太多会导致性能下降
rocketMQ针对大topic支持的调整
  • 调整中心节点: rocketMQ 使用的无状态的 nameserv 的模式,只储存他们的端口消息,不储存元数据,在大 topic 的情况下对中心节点的影响很小

  • 采用混合储存的方式减少文件的数量(文件数量减少 1/3)

参考

https://kafka.apache.org/documentation/#introduction

https://rocketmq.apache.org/zh/docs/featureBehavior/01normalmessage

https://blog.csdn.net/m0_71513446/article/details/143386962

https://rocketmq-learning.com/faq/ons-user-question-history16752/

https://www.bilibili.com/video/BV1Zy411e7qY/?spm_id_from=333.337.search-card.all.click&vd_source=45cb101876b00a49e608d7ab220c9736

相关文章:

消息队列(kafka 与 rocketMQ)

为什么要使用消息队列?作用1: 削峰填谷(突发大请求量问题)作用2: 解耦(单一原则)作用3: 异步(减少处理时间) 如何选择消息队列(kafka&RocketMQ)成本功能性能选择 rocketMQ是参考kafka进行实现的为什么rocketMQ与kafka性能差距很大呢?kafka 的底层数据储存实现rocketMQ 的…...

【STM32】Flash详解

【STM32】Flash详解 文章目录 【STM32】Flash详解1.Flash闪存概念1. 1核心区别:NOR Flash vs. NAND Flash1.2 为什么常说的“Flash”多指 NAND Flash?1.3技术细节对比(1) 存储单元结构(2) 应用场景(3) 可靠性要求 1.4总结 2.STM32内部的Flash2.1为什么是…...

CV - 目标检测

物体检测 目标检测和图片分类的区别: 图像分类(Image Classification) 目的:图像分类的目的是识别出图像中主要物体的类别。它试图回答“图像是什么?”的问题。 输出:通常输出是一个标签或一组概率值&am…...

node-modules-inspector 可视化node_modules

1、node_modules 每个vue的项目都有很多的依赖,有的是dev的,有的是生产的。 2、使用命令pnpx node-modules-inspector pnpx node-modules-inspector 3、node_modules可视化 4、在线体验 Node Modules Inspector 5、github地址 https://github.com/a…...

远程服务器下载llama模型

适用于有防火墙不能直接从HF上下载的情况 然后,你可以克隆 Llama-3.1-8B-Instruct 模型: git clone https://你的用户名:你的访问令牌hf-mirror.com/meta-llama/Llama-3.1-8B-Instruct用户名,令牌来自huggingface官网 注意:要提…...

Spring 中的 @Autowired 和 @Resource

🧩 一、Autowired 和 Resource 的基本作用 注解来源作用AutowiredSpring 提供(org.springframework.beans.factory.annotation.Autowired)按类型 自动注入ResourceJDK 提供(javax.annotation.Resource)默认按名称 注入…...

自定义汇编语言(Custom Assembly Language) 和 Unix Git

1. 什么是自定义汇编语言(Custom Assembly Language)? 汇编语言(Assembly Language)是一种低级编程语言,它直接与 CPU 指令集(Instruction Set Architecture, ISA)对应,…...

Python菜鸟教程(小程序)

目录 一.简易计算器 二.学生成绩分级 三.密码设置 四.作业选择 点赞收藏,评论支持 一.简易计算器 print(-------使用的运算符-------\n) print(1.加号) print(2.减号) print(3.乘号) print(4.除号) Aint(input(请输入第一个数: )) Bint(input(请输入第二个数: )) Fi…...

2011-2019年各省地方财政金融监管支出数据

2011-2019年各省地方财政金融监管支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政金融监管支出 4、范围:31省 5、指标说明:地方财政在金融监管方面的支出…...

Java大厂面试题 -- JVM 优化进阶之路:从原理到实战的深度剖析(2)

最近佳作推荐: Java大厂面试题 – 深度揭秘 JVM 优化:六道面试题与行业巨头实战解析(1)(New) 开源架构与人工智能的融合:开启技术新纪元(New) 开源架构的自动化测试策略优…...

SQL LIKE 语句详解

SQL LIKE 语句详解 引言 SQL(Structured Query Language)是用于管理关系数据库的标准语言。在SQL中,LIKE 语句是一种常用的字符串匹配操作符,用于在查询中搜索包含特定模式的字符串。本文将详细介绍 LIKE 语句的用法、规则以及注意事项。 一、什么是 LIKE 语句? LIKE …...

现代Web应用中的时光机器:深入解析撤销/重做功能的艺术与科学

引言:数字世界的安全网 在现实世界中,我们拥有橡皮擦、撤销键和后悔药(比喻意义上)。数字世界同样需要这样的安全保障。研究表明: **85%**的用户会在完成复杂表单时犯至少一个错误 提供撤销功能的界面可将用户满意度…...

存储引擎 / 事务 / 索引

1. 存储引擎 MySQL 中特有的术语。 (Oracle 有,但不叫这个名字) 是一种表存储 / 组织数据的方式 不同的存储引擎,表存储数据的方式不同 1.1 查看存储引擎 命令: show engines \g(或大写:G…...

Go语言-初学者日记(八):构建、部署与 Docker 化

🧱 一、go build:最基础的构建方式 Go 的构建工具链是出了名的轻量、简洁,直接用 go build 就能把项目编译成二进制文件。 ✅ 构建当前项目 go build -o myapp-o myapp 指定输出文件名默认会构建当前目录下的 main.go 或 package main &a…...

【ESP32】ESP32物联网应用:MQTT控制与状态监测

ESP32物联网应用:MQTT控制与状态监测 引言 在物联网时代,远程监测和控制设备已经成为现实生活中常见的需求。本文将介绍如何使用ESP32微控制器配合MQTT协议,实现一个简单而强大的物联网应用:远程状态监测和设备控制。我们将以巴…...

RabbitMQ运维

RabbitMQ运维 一.集群1.简单介绍2.集群的作用 二.搭建集群1.多机多节点搭建步骤 2.单机单节点搭建步骤 3.宕机演示 三.仲裁队列1.简单介绍2.Raft协议Raft基本概念主节点选举选举过程 3.仲裁队列的使用 四.HAProxy负载均衡1.安装HAProxy2.HAProxy的使用 一.集群 1.简单介绍 Ra…...

Ansible 实战:Roles,运维的 “魔法函数”

一、介绍 你现在已经学过tasks和handlers,那么,最好的playbook组织方式是什么呢?答案很简单:使用roles!roles基于一种已知的文件结构,能够自动加载特定的vars_files、tasks以及handlers。通过roles对内容进…...

CVAT安装和使用(Windows)

必要组件安装 WSL2 Docker Git Chrome Install WSL2 (Windows subsystem for Linux) refer to this official guide. WSL2 requires Windows 10, version 2004 or higher. After installing WSL2, install a Linux Distribution of your choice. 安装 WSL2(适用…...

Spring 中的 bean 生命周期

🌱 一、什么是 Bean 生命周期? 在 Spring 容器中,一个 Bean 从“创建 → 初始化 → 使用 → 销毁”,经历了完整的生命周期。 Spring 提供了 多个扩展点 让你可以在这些阶段做事情,比如注入资源、日志记录、连接资源、清…...

关于JVM和OS中的指令重排以及JIT优化

关于JVM和OS中的指令重排以及JIT优化 前言: 这东西应该很重要才对,可是大多数博客都是以讹传讹,全是错误,尤其是JVM会对字节码进行重排都出来了,明明自己测一测就出来的东西,写出来误人子弟… 研究了两天&…...

微软推出首款量子计算芯片Majorana 1

全球首款拓扑架构量子芯片问世,2025年2月20日,经过近20年研究,微软推出了首款量子计算芯片Majorana 1,其宣传视频如本文末尾所示。 微软表示,开发Majorana 1需要创造一种全新的物质状态,即所谓的“拓扑体”…...

数组练习题总结

一、求出数组中的最大值let arr [1, 2, 5, 7];let max 0;for (i 0; i < arr.length; i) {// console.log(max);if (max < arr[i]) {max arr[i];}}console.log(max); 首先生成一个数组&#xff0c;设一个变量为保存最大值&#xff0c;写一个循环&#xff0c;在循环里写…...

Kotlin 中的 `reified` 关键字全解析:保留类型信息 + 优化高阶函数的双重魔法

在使用 Kotlin 编写泛型函数时&#xff0c;你是否遇到过这样的尴尬&#xff1a;你想判断某个对象是不是泛型类型 T&#xff0c;结果却发现代码根本编译不过&#xff1f;这是因为 Kotlin 和 Java 一样&#xff0c;泛型在运行时会被类型擦除。 为了解决这个问题&#xff0c;Kotl…...

在CPU服务器上部署Ollama和Dify的过程记录

在本指南中&#xff0c;我将详细介绍如何在CPU服务器上安装和配置Ollama模型服务和Dify平台&#xff0c;以及如何利用Docker实现这些服务的高效部署和迁移。本文分为三大部分&#xff1a;Ollama部署、Dify环境配置和Docker环境管理&#xff0c;适合需要在本地或私有环境中运行A…...

【计网】TCP 协议详解 与 常见面试题

三次握手、四次挥手的常见面试题 不用死记&#xff0c;只需要清楚三次握手&#xff0c;四次挥手的流程&#xff0c;回答的时候心里要记住&#xff0c;假设网络是不可靠的 问题(1)&#xff1a;为什么关闭连接时需要四次挥手&#xff0c;而建立连接却只要三次握手&#xff1f; 关…...

Java 基础-31-枚举-认识枚举

在Java编程语言中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的类&#xff0c;它允许一组固定的常量。它们非常适合用来表示一组固定的值&#xff0c;比如星期几、季节、颜色等。枚举自Java 5开始引入&#xff0c;为定义常量提供了一种更强大和方便的方式。本文将…...

7.4 SVD 的几何背景

一、SVD 的几何解释 SVD 将矩阵分解成三个矩阵的乘积&#xff1a; ( 正交矩阵 ) ( 对角矩阵 ) ( 正交矩阵 ) (\pmb{正交矩阵})\times(\pmb{对角矩阵})(\pmb{正交矩阵}) (正交矩阵)(对角矩阵)(正交矩阵)&#xff0c;用几何语言表述其几何背景&#xff1a; ( 旋转 ) ( 伸缩 )…...

低延迟云网络的核心技术

低延迟云网络通过架构优化、协议创新、硬件加速等多维度技术手段,将数据传输延迟降低至毫秒级甚至微秒级。 1. 网络架构优化 1.1 扁平化网络Leaf-Spine 架构 减少网络层级,缩短数据转发路径(如数据中心内部一跳可达)。 扁平化网络Leaf-Spine(叶子-脊椎)架构是一种现代…...

C++的多态-上

目录 多态的概念 多态的定义及实现 1.虚函数 2. 多态的实现 2.1.多态构成条件 2.2.虚函数重写的两个例外 (1)协变(基类与派生类虚函数返回值类型不同) (2)析构函数的重写(基类与派生类析构函数的名字不同) 2.3.多态的实现 2.4.多态在析构函数中的应用 2.5.多态构成条…...

内存与显存:从同根生到殊途异路的科技演进

在现代计算机的世界里&#xff0c;内存和显存是两个不可或缺的硬件组件。它们看似功能相近&#xff0c;却在发展历程中逐渐分道扬镳&#xff0c;各自服务于不同的计算需求。今天&#xff0c;我们将从一根内存条和一块显卡入手&#xff0c;深入探讨内存与显存的异同&#xff0c;…...