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

基于电商场景的高并发RocketMQ实战-Commitlog基于内存的高并发写入优化、基于JVM offheap的内存读写分离机制

🌈🌈🌈🌈🌈🌈🌈🌈
【11来了】文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁

Commitlog 基于内存的高并发写入优化

首先,Commitlog 将数据写入磁盘使用的是 磁盘顺序写,这样带来的性能提升是很大的

但是仅仅使用磁盘顺序写,对写入性能的提升还是有限,于是还是用了 mapping 文件内存映射机制,即先把消息数据写入到内存中,再从内存将数据 异步 刷入到磁盘中去,那么就将 磁盘顺序写 又进一步优化为了 内存写 操作

那么通过内存映射优化写入过程,如下图红色部分:

总结:

那么这里基于磁盘顺序写,还添加了 mapping 文件映射机制 来进一步提升了文件性能,将磁盘顺序写优化为内存写操作!

基于 JVM offheap 的内存读写分离机制

broker busy 问题

一般来说,在服务器上部署了一个 java 应用之后,这个应用作为一个 jvm 进程在服务器运行,此时内存一般分为三种:

  • jvm 堆内存:由 jvm 管理
  • offheap 内存:jvm 堆外的内存
  • page cache:操作系统管理的内存

那么通过将消息写入内存中的 page cache 中来大幅提高写消息的性能,但是在高并发的场景下,可能会出现 broker busy,也就是 broker 太繁忙,导致一些操作被阻塞,这是因为高并发下,大量读写操作对同一个 Commitlog 磁盘文件在内存中的映射文件 page cache 同时进行写操作,导致这一个 page cache 被竞争使用的太激烈

那么 RocketMQ 提供了 transientStorePoolEnabled(瞬时存储池启用) 机制来解决 broker busy 的问题,通过这个机制就可以实现 内存级别的读写分离

这个 transiendStorePoolEnabled 机制 也就是:在高并发消息写入 Broker 的时候,先将消息写在 JVM 的堆外内存中,有一个后台线程会定时将消息再刷入内存的 page cache 中,此时针对 MappedFile 的 page cache 的高并发写就转移到了 JVM 的堆外内存 中,而对于 Consumer 的高并发的读操作最终是落在了 MappedFile 的 page cache 中,实现了高并发读写的分离

总之呢,这个机制实现了高并发的读写分离,消费者高并发的读从 read queue 中读取数据,最终高并发的读肯定是落到了 MappedFile 的 page cache 中,而生产者高并发的写则是直接面向了 jvm offheap 堆外内存,就不会出现 MappedFile page cache 高并发情况下的争用问题了,如下图紫色部分:

在这里插入图片描述

基于系统设计层面的考虑:

虽然使用 transiendStorePoolEnabled 机制可以提高高并发场景下 Broker 的读写性能,但是这可能会造成一定的数据丢失!

在这个机制之下,数据会先写入 jvm offheap 中,也就是堆外内存,如果 jvm 进程挂了,就会导致 jvm offheap 中的数据还没来得及刷到 MappedFile page cache 中就丢失了,而 jvm 进程挂掉的概率还是挺大的,因此这个机制是牺牲了一定的数据可靠性,来提升了性能!

所以,针对不同的场景,要做出不同的设计,如果是对消息严格要求可靠的金融等场景来说,那么就不能使用这个机制,其他情况下保持默认就可以了!

相关文章:

  • SadTalker数字人增加视频输出mp4质量精度
  • C#/WPF JSON序列化和反序列化
  • C单片机关键字extern、static 和 const
  • WPF Border
  • labelme目标检测数据类型转换
  • 重组蛋白表达系统的比较-卡梅德生物
  • Unity 渲染顺序受哪些影响(相机depth、SortingLayer、Render Queue、透明)
  • mysql的统计数据count
  • AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用
  • 【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!
  • 云渲染UE4像素流送搭建(winows、ubuntu单实例与多实例像素流送)
  • SQL进阶:子查询
  • 轻量Http客户端工具VSCode和IDEA
  • AutoSAR(基础入门篇)2.2-AutoSAR架构中的Ports类型与Runnables可运行实体
  • 智能优化算法应用:基于厨师算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 《剑指offer》分解让复杂问题更简单
  • 10个最佳ES6特性 ES7与ES8的特性
  • android 一些 utils
  • Django 博客开发教程 8 - 博客文章详情页
  • gf框架之分页模块(五) - 自定义分页
  • Making An Indicator With Pure CSS
  • Map集合、散列表、红黑树介绍
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Sass 快速入门教程
  • Spring声明式事务管理之一:五大属性分析
  • SQLServer之创建数据库快照
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 全栈开发——Linux
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 写代码的正确姿势
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #《AI中文版》V3 第 1 章 概述
  • #stm32驱动外设模块总结w5500模块
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $L^p$ 调和函数恒为零
  • (C++17) optional的使用
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (八)Spring源码解析:Spring MVC
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (推荐)叮当——中文语音对话机器人
  • (一)认识微服务
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)jQuery 基础
  • (转)程序员技术练级攻略
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .chm格式文件如何阅读
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别