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

【性能最佳实践】事务处理和读写策略原来这么关键!

MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐!

欢迎阅读有关MongoDB性能最佳实践的系列博文。

单文档的原子性

MongoDB的文档模型可以将相关数据汇集到一起,简化了传统关系型数据库中需要通过父子表关系建模的复杂性。其单文档操作具备原子性,能够满足大多数应用程序对数据完整性的要求。

在MongoDB中,单个操作可以同时更新多个字段,包括对多个子文档和数组元素的修改。MongoDB首先会确保文档在更新过程中的完全隔离;同时,任何操作错误都会触发回滚机制,保证客户端获取的文档总是一致的。

多文档ACID事务的引入

MongoDB中的事务为开发者提供了一种熟悉的体验,如同关系型数据库中的事务一样,具有多语句支持和相似的语法结构,便于集成到任何应用程序中。事务通过提供快照隔离来确保数据的一致性,并且遵循“全有或全无”的原则,同时对那些不依赖于事务特性的工作负载的性能没有负面影响。

您可以通过查阅我们在VLDB会议上发布的论文中的TPC-C基准测试结果来了解事务的性能表现。

此外,我们提供了一些策略,帮助您在应用程序中最大限度地利用MongoDB事务的优势。

多文档事务的最佳实践

创建长时间运行的事务,或在单个ACID事务中执行过多操作,都可能对WiredTiger存储引擎的缓存造成显著压力。这是因为缓存需要从最早的快照创建开始,就为后续所有的写入操作保持状态。由于事务在运行过程中始终使用同一快照,因此缓存中会不断积累新的写入,直到长时间运行的事务提交或中止,释放其所持锁定时,这些写入才能从缓存中被清除。

为了保持数据库性能的可预测性,开发人员应考虑以下建议。

1 事务运行时限制

默认情况下,MongoDB会自动终止运行时间超过60秒的多文档事务。不过,如果服务器的写入负载相对较低,您可以调整事务设置,延长其执行时间。

为了防止事务超时,建议将大型事务拆分成多个较小的操作,确保它们能够在设定的时间限制内完成。同时,应当优化查询模式,并确保拥有合适的索引,这样可以在事务过程中快速访问数据。

2 事务中的操作数量

虽然在事务中读取的文档数量并没有严格的限制,但从最佳实践来看,建议在一个事务中修改的文档数量不要超过1,000个。

对于需要修改超过1,000个文档的操作,开发人员应考虑将这些操作分解为多个部分,每个部分处理一批文档,以此来组织事务。

3 分布式、多分片事务

跨多个分片执行的事务会带来较高的性能开销,因为这需要在多个节点间通过网络进行协调。

在多分片环境中,只有使用快照读关注点(snapshot read concern)才能保证提供一致的数据快照。然而,如果对延迟的敏感度超过了对跨分片读取一致性的需求,可以选择默认的本地读关注点,该选项在每个分片的本地快照上进行操作。

4 异常处理

当事务被中止时,相关的异常会被返回给客户端驱动程序,并且事务的更改会被完全撤销。开发人员需要在应用程序中实现逻辑来捕获这些异常,并对因暂时性问题(例如多版本并发控制(MVCC)的写入冲突、短暂的网络错误或主节点选举)而中止的事务进行重试。

当启用可重试写入功能时,MongoDB的驱动程序会自动重试提交事务的操作。

5 写入延迟的优势

尽管刚开始可能不那么直观,但使用多文档事务实际上可以通过减少提交所需的延迟来提升写入性能。

当采用“w:majority”这一写关注点时,如果执行10次独立的更新操作,每次更新都必须等待复制到多数节点的时间。而如果把这10个更新操作放入一个事务中执行,这些操作会在事务提交时一次性复制。这种做法可以将延迟降低到原来的十分之一。

选择适当的写保证

MongoDB允许您在执行写操作时选择所需的持久性级别,这被称为写关注点(write concern)。

值得注意的是,写关注点适用于数据库中的所有操作,无论是对单个文档的简单操作还是多文档事务的一部分。

您可以根据需要在每个连接、数据库、集合,甚至是单个操作的基础上配置以下选项:

● 已确认写入:这是默认设置。mongod确认执行了写操作,这样客户端就能捕捉到网络问题、键冲突、模式验证错误等异常。

● 已写入日志:mongod仅在操作被记录到主节点的操作日志后才确认写操作。这确保了即使mongod崩溃,写操作也能得到保留,保证了写入的持久性。

● 已复制:您还可以选择等待操作被副本集中的其他成员确认。MongoDB支持将写入确认到指定数量的副本。这也确保了写操作被记录在包括主节点在内的辅助节点的日志中。

● 大多数:这种写关注点等待写操作被大多数副本集成员应用,并且在主节点选举事件中不会被回滚。这也确保了写操作被记录在这些成员的日志中,包括主节点。

以上是MongoDB中关于写关注点的选项,它们帮助您根据应用需求调整数据的持久性和复制保证。

选择适当的读关注点

与写关注点类似,读关注点也适用于数据库中的任何查询操作,无论是对单个文档或一组文档的常规读取,还是作为多文档事务的一部分。

为了保证数据的隔离性和一致性,可以将读关注点设置为majority。这意味着只有当数据已经被复制到副本集大多数成员之后,这些数据才会返回给应用程序,从而保证在主节点选举过程中数据不会发生回滚。

MongoDB还提供了“可线性化”(linearizable)的读关注点级别。启用可线性化读关注点可以确保在读取数据时,该节点仍是副本集的主节点,并且在发生主节点切换后,所返回的数据不会被回滚。但是,配置此级别的读关注点可能会显著增加延迟,因此建议设置maxTimeMS值来为长时间运行的操作设定超时限制。

在需要时使用因果一致性

因果一致性确保在客户端会话中,无论请求被哪个副本节点服务,每次读操作都能看到前一次写操作的结果。您可以根据需要启用因果一致性,仅在需要保证读操作的顺序性时使用它,从而减少潜在的延迟影响。

设置阿里云MongoDB 的默认写关注

阿里云MongoDB 已最新支持 7.0 版本,您可以在阿里云MongoDB 实例详情页的「参数设置」部分,根据需要,对于阿里云MongoDB 的默认写关注进行设置。

相关文章:

【性能最佳实践】事务处理和读写策略原来这么关键!

MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐! 欢迎阅读有关MongoDB性能最佳实践的系列…...

【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子

作者推荐 视频算法专题 涉及知识点 广度优先搜索 网格 割点 并集查找 LeetCode:1263. 推箱子 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或…...

开店怎么做进销存

开设一家店铺,无论是实体店还是网店,进销存管理都是确保店铺正常运营和盈利的关键环节。一款良好的进销存管理软件可以帮助你更好地掌握库存情况、优化采购策略、提高销售效率,并最终实现盈利目标。那么,开店怎么做进销存管理呢&a…...

UE4 C++联网RPC教程笔记(三)(第8~9集)完结

UE4 C联网RPC教程笔记(三)(第8~9集)完结 8. exe 后缀实现监听服务器9. C 实现监听服务器 8. exe 后缀实现监听服务器 前面我们通过蓝图节点实现了局域网连接的功能,实际上我们还可以给项目打包后生成的 .exe 文件创建…...

程序员一定要远离“钻研技术无用,搞钱才是正道”的言论

不知道大家有没有刷到过这样的言论: "程序员真的不要花大量时间研究底层代码,技术钻研的再高级再牛也逃不过被优化的下场。 前辈们开发一个功能用一天,我开发一个功能得用一个星期,只会显得我像一个技术菜鸟&#xff0…...

el-table同时固定左列和右列时,出现错误情况

最近遇到一个问题,就是需求是要求表格同时固定序号列和操作列,我们用的是饿了么组件库的el-table,如下图,出现了错误情况: 解决方法就是使用doLayout方法: 如果使用了keep-alive,可以在activated里执行doLayout方法: activated() {this.$nextTick(() => {this.$ref…...

django自定义后端过滤

​ DRF自带的过滤 第一个 DjangoFilterBackend 是需要安装三方库见[搜索:多字段筛选]两外两个是安装注册了rest_framework就有。 如上图,只要配置了三个箭头所指的方向,就能使用。 第一个单字段过滤 用户视图集中加上filterset_fields …...

计算机网络Day03--物理层

信道复用技术 频分复用 时分复用 统计时分复用 频分复用(FDM) 最基本 将整个宽带分为多份,用户在分配到一定的频带后,在通信过程中自始至终都使用这个频带 所有的用户在同一时间占用不同的带宽资源,以并行的方式工…...

RabbitMQ节点故障的容错方案

RabbitMQ节点故障的容错方案 1. broker启动加载逻辑1.1 日志文件1.2 broker启动流程1.2.1 整体流程1.2.2 数据恢复流程 2. 队列高可用2.1 选主逻辑2.1.1 从节点晋升策略2.1.2 主队列选择策略 2.2 HA切换 3. 疑问和思考3.1 如果一个broker宕机,运行在broker上的队列数…...

瑞_Redis_初识Redis(含安装教程)

文章目录 1 初识Redis1.1 认识NoSQL1.1.1 结构化与非结构化1.1.2 关联和非关联1.1.3 查询方式1.1.4 事务1.1.5 总结 1.2 认识Redis1.2.1 介绍1.2.2 特征1.2.3 优势 1.3 安装Redis ★★★1.3.1 Linux安装Redis1.3.1.1 安装Redis依赖 1.3.2 Windows安装Redis1.3.2.1 安装步骤1.3.…...

Android进阶(二十九) 走近 IntentFilter

文章目录 一、什么是IntentFilter ?二、IntentFilter 如何过滤隐式意图?2.1 动作测试2.2 类别测试2.3 数据测试 一、什么是IntentFilter ? 如果一个 Intent 请求在一片数据上执行一个动作, Android 如何知道哪个应用程序&#xf…...

vue+element下日期组件momentjs转换赋值问题

记录下使用momentjs转换日期字符串赋值给element的日期组件报错问题&#xff1b; <el-date-pickerv-model"form.serviceTime"type"date"class"fill-w mar-t-xs"value-format"yyyy-MM-dd HH:mm:ss"placeholder"请选择日期&quo…...

普源(RIGOL) DHO914S示波器 简单开箱评测

普源精电(RIGOL) DHO914S 12bit数字示波器 简单开箱评测。 旧的示波器感觉不好用&#xff0c;所以换个新的&#xff0c;看中了普源的这款&#xff0c;主要看中它便携支持PD供电&#xff0c;还有伯德图功能&#xff0c;以及12bit的垂直分辨率。如果你对我上面说的点没需求&…...

docker 安装Oracle19c

一、下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c通过docker images 命令查看 如下图&#xff1a;已经有oracle 19c镜像。 二、创建挂载文件 # 创建文件 mkdir -p /home/data/oracle/oradata# 授权&#xff0c;不授权会导致后面安装失败 c…...

qt-OPENGL-星系仿真

qt-OPENGL-星系仿真 一、演示效果二、核心程序三、下载链接 一、演示效果 二、核心程序 #include "model.h"Model::Model(QOpenGLWidget *_glWidget) { glWidget _glWidget;glWidget->makeCurrent();initializeOpenGLFunctions(); }Model::~Model() {destroyV…...

Java实战:Spring Boot实现AOP记录操作日志

本文将详细介绍如何在Spring Boot应用程序中使用Aspect Oriented Programming&#xff08;AOP&#xff09;来实现记录操作日志的功能。我们将探讨Spring Boot集成AOP的基本概念&#xff0c;以及如何使用Spring Boot实现AOP记录操作日志。最后&#xff0c;我们将通过一个具体示例…...

C++ //练习 7.38 有些情况下我们希望提供cin作为接受istream参数的构造函数的默认实参,请声明这样的构造函数。

C Primer&#xff08;第5版&#xff09; 练习 7.38 练习 7.38 有些情况下我们希望提供cin作为接受istream&参数的构造函数的默认实参&#xff0c;请声明这样的构造函数。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 Sa…...

算法:两数之和

算法&#xff1a;两数之和 方法一&#xff1a;暴力法 function twoSum(nums, target) {for (let i 0; i < nums.length; i) {for (let j i 1; j < nums.length; j) {if (nums[i] nums[j] target) {return [i, j];}}}return null; }方法二&#xff1a;哈希表 func…...

pytorch: ground truth similarity matrix

按照真实标签排序pair-wise相似度矩阵的Pytorch代码 本文仅作留档&#xff0c;用于输出可视化 Inputs: Ground-truths Y ∈ R n 1 \mathbf{Y}\in\mathbb R^{n\times 1} Y∈Rn1, Similarity matrix A ∈ R n n \mathbf{A}\in\mathbb R^{n\times n} A∈RnnOutputs: Block dia…...

鸿蒙 gnss 开关使能流程

先WiFi&#xff0c;后 定位&#xff0c;再从蓝牙到NFC&#xff0c;这个就是我大致熟悉开源鸿蒙代码的一个顺序流程&#xff0c;WiFi 的年前差不多基本流程熟悉了&#xff0c;当然还有很多细节和内容没有写到&#xff0c;后续都会慢慢的丰富起来&#xff0c;这一篇将开启GNSS的篇…...

设计模式-创建型模式-抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff1a;提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。抽象工厂模式又称为Kit模式&#xff0c;它是一种对象创建型模式。 由于工厂方法模式中的每个工厂只生产一类产品&…...

【Go】五、Grpc 的入门使用

grpc 与 protobuf grpc 使用的是 protobuf 协议&#xff0c;其是一个通用的 rpc 框架&#xff0c;基本支持主流的所有语言、其底层使用 http/2 进行网络通信&#xff0c;具有较高的效率 protobuf 是一种序列化格式&#xff0c;这种格式具有 序列化以及解码速度快&#xff08;…...

PDF加粗内容重复读取解决方案

文章目录 前言发现问题解决方案问题分析大致逻辑 show my code 前言 在使用pdfplumber读取PDF的过程中&#xff0c;由于加黑的内容会被莫名其妙的读取两次&#xff0c;带来了很大的困扰。这篇文章将给出解决方案。 发现问题 在在使用pdfplumber读取PDF的过程中&#xff0c;读…...

Golang 并发 Channel的用法

目录 Golang 并发 Channel的用法1. channel 的创建2. nil channel读写阻塞示例close示例 3. channel 的读写4. channel 只读只写5. 关闭channelchannel关闭后&#xff0c;剩余的数据能否取到读取关闭的channel&#xff0c;将获取零值使用ok判断&#xff0c;是否关闭使用for-ran…...

cfa复习资料介绍之二:notes(SchweserNotes)

什么是CFA notes? CFA资料Study Notes都是外国一些出版机构针对CFA考试提供的复习资料&#xff0c;而其中Schweser在国内的名气最大&#xff0c;用的人也最多。内容详尽并且突出重点&#xff0c;并且CFA Notes的内容相比于官方curriculum教材更加符合中国CFA考生的心态&#x…...

FITC Palmitate Conjugate,FITC-棕榈酸酯缀合物,可以用标准 FITC 滤光片组进行成像

FITC Palmitate Conjugate&#xff0c;FITC-棕榈酸酯缀合物&#xff0c;可以用标准 FITC 滤光片组进行成像 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;FITC Palmitate Conjugate&#xff0c;FITC-棕榈酸酯缀合物&#xff0c;FITC 棕榈酸酯缀合物&#xff0c;F…...

本机防攻击简介

定义 在网络中&#xff0c;存在着大量针对CPU&#xff08;Central Processing Unit&#xff09;的恶意攻击报文以及需要正常上送CPU的各类报文。针对CPU的恶意攻击报文会导致CPU长时间繁忙的处理攻击报文&#xff0c;从而引发其他业务的中断甚至系统的中断&#xff1b;大量正常…...

Python 进阶语法:JSON

1 什么是 JSON&#xff1f; 1.1 JSON 的定义 JSON 是 JavaScript Object Notation 的简写&#xff0c;字面上的意思是 JavaScript 对象标记。本质上&#xff0c;JSON 是轻量级的文本数据交换格式。轻量级&#xff0c;是拿它与另一种数据交换格式XML进行比较&#xff0c;相当轻…...

mescroll 在uni-app 运行的下拉刷新和上拉加载的组件

官网传送门: https://www.mescroll.com/uni.html 最近使用到了mescroll 但是一直都是整个页面的滚动, 最近需求有需要局部滚动, 收藏了一个博主的文章觉得写的还挺好, 传送门: https://blog.csdn.net/Minions_Fatman/article/details/134754926?spm1001.2014.3001.5506 使用…...

netty的TCP服务端和客户端实现

第一步&#xff1a;引入依赖 <dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.90.Final</version></dependency></dependencies> 第二步&#xff1a;实…...