关于在分布式环境中RVN和使用场景的介绍3
简介
在《关于在分布式环境中RVN和使用场景的介绍2》和《关于在分布式环境中RVN和使用场景的介绍1》中我们介绍了RVN的概念和在一些具体用例中的使用。在本文中我们讨论一下在分布式环境中使用RVN需要注意的问题。
问题
我们在收到一条待处理的事件时,需要检查该事件的RVN是否已经太旧。如果该事件的RVN已经太旧,我们就不再处理该事件,并且丢弃该事件。通过这个逻辑,我们可以保障在分布式环境中正确的处理消息的乱序,丢失,和重复等问题。就这个逻辑本身而言是非常简单的。但是我们现在要考虑到分布式环境中所有的消息处理都是并行的,我们需要小心的检查这个逻辑的实现。在本文中,我们讨论一下如何在分布式环境中正确的处理这个逻辑。
解决方案
关于RVN更新的基本逻辑和它所能解决的问题,可以参看《关于在分布式环境中RVN和使用场景的介绍1》。下面是基于两种不同方法的RVN的实现方案。
基于锁的解决方案
在并行编程中,锁(lock)是很常见的工具。锁的功能是可以在多个并行逻辑都想访问同一个资源时进行同步。具体来说,我们可以认为锁提供了如下的接口:
Acquire(key)Release(key)
当一个并行逻辑试图访问某个资源(该资源以“key”作为标识),它需要先lock该资源的key。假如没有其它的并行逻辑已经获得该资源的锁,则此并行逻辑可以获得该资源的锁,并且可以继续执行以使用该资源;否则此并行逻辑将被阻塞在该锁上,直到使用该资源的其它并行逻辑release了该锁。
在分布式环境中同样可以实现lock。比如AWS里的DynamoDB Lock Client。这是一个基于DynamoDB的表实现的锁,任何AWS里的计算资源(比如Lambda,ECS,EC2)都可以通过创建DynamoDB Lock Client以达到互相同步的目的。关于DynamoDB Lock Client的具体介绍可以参看这里。
下面是一个可以正常工作的使用DynamoDB Lock Client来维护RVN的逻辑流程:
在这里我们需要注意对于RVN的检查和RVN检查以后对于当前消息的处理都必须一直在持有锁的状态下执行。这是因为一旦锁已经释放,就有可能更新的RVN的消息开始被处理,从而和更新RVN和消息处理产生冲突。
基于锁的解决方案的缺点是需要额外的二次DynamoDB的操作,也就是对锁的获取和释放。当我们需要处理很多消息时,这样做的效率是比较低的,同时也会产生大量额外的费用。
基于DynamoDB的Condition Update的解决方案
另一种对RVN的维护方式可以使用DynamoDB的condition update。DynamoDB的condition update允许我们在update的请求里指定一些条件,只有当该条件满足时该update的请求才会被执行,否则就会被拒绝。关于DynamoDB的condition update可以参看这个文档。
利用condition update,我们可以使用RVN作为condition,要求被更新的数据或者不存在,或者RVN小于新的数据。该condition会被如下形式定义:
attribute_not_exists(#hashKey) OR (#versionNumber <= :versionNumber)
当我们使用condition update来解决冲突问题时,我们应该考虑将RVN和被存储的数据写在一个表中,从而可以使用condition update在更新数据时检查RVN是否是新的RVN。这个方案解决了需要额外访问DynamoDB的问题,但是这个方案的缺点也很明显,就是对于复杂的处理的逻辑灵活性很差。比如说我们考虑使用收到的消息更新两个表的数据。那么我们就必须在两个表中都存储RVN的信息。再比如说我们需要使用收到的两种消息更新同一个表。那么我们就必须在一个表中维护两种消息的RVN。当消息的处理逻辑比较复杂时,这种混乱的表定义无疑会增加开发和维护的难度。
问题的扩展
现在我们考虑如果我们的消息里有大量的消息是针对同一个key的,也就是说大量的消息之间需要同步执行。假如我们使用锁的方案,我们就会发现这些消息本质上是串行处理的,效率很低。在这里我们除了可以考虑使用《关于在分布式环境中RVN和使用场景的介绍2》中提到的方法来减少需要处理的消息数量外,还可以在获取锁之前先检查RVN是否有效来达到优化的目的。
我们具体来考虑如下的例子。我们收到RVN的顺序是:1,4,3, 2,5。假如我们按照普通的流程,我们需要串行处理这五条消息。其中每一条都需要两次DynamoDB的操作(也就是锁的获取和释放),其中RVN 1,4,5需要消息的处理,所以我们总共需要10次DynamoDB的操作,3次次消息处理,总共有5条消息被串行处理。但是如果我们在试图获取锁之前,先检查RVN是否已经太旧,我们就会在获取锁之前将RVN 3和2丢弃,所以我们只需要6次DynamoDB的操作,3次消息处理,总共有3条消息被串行处理。这样的流程图如下所示:
在这里我们有两点需要注意:
- 第一,即便我们有了这个防御机制,我们在获取锁之后对于仍然需要对RVN进行第二次检查。这是因为在我们获取锁的过程中,我们的RVN有可能已经变得不再有效。
- 第二,第一次对于RVN的检查仍然需要一次DynamoDB的读操作。如果该次检查RVN是有效的,则该次DynamoDB的读是浪费的。所以是否采用这种防御机制仍然需要根据具体情况决定,并不能保证一定是更好的方案。
通过对本文中问题的讨论,我们可以看到在分布式环境中编写程序是复杂和混乱的,当然带来的好处就是效率的提升,未来扩展的灵活,还有容错性增强等等。但是我们需要主要注意的是在分布式环境中给出一个简介同时高效的设计尤为重要,因为一旦在分布式环境中出现设计上的缺陷以及设计上的重构,都会比集中环境要复杂的多。我们会在以后的文章中对其它一些模式做进一步讨论。
相关文章:

关于在分布式环境中RVN和使用场景的介绍3
简介 在《关于在分布式环境中RVN和使用场景的介绍2》和《关于在分布式环境中RVN和使用场景的介绍1》中我们介绍了RVN的概念和在一些具体用例中的使用。在本文中我们讨论一下在分布式环境中使用RVN需要注意的问题。 问题 我们在收到一条待处理的事件时,需要检查该…...

计算最小公倍数math.lcm()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算最小公倍数 math.lcm() 请问以下代码输出的结果是? import math print("【执行】math.lcm(2, 4)") print(math.lcm(2, 4)) print("【执行】math.lcm(1, 2, 3…...
VUE SEO 几种方案经典面试题
1、SSR服务器渲染 Vue.js 是构建客户端应用程序的框架。默认情况下,可以再浏览器中输出Vue组件,进行生成DOM和操作DOM。然而,也可以将同一个组件渲染未服务器端的HTML字符串,将它们直接发送到浏览器,最后将这些静态标…...
Python和VBA批量提取Word中的表格
表格在word文档中常见的文档元素之一。操作word文件时有时需要提取文件中多个表格的内容到一个新的文件,甚至有时还会要提取题注信息。 今天,给大家分享两种批量提取文档中表格的两种方法,分别是VBA法和Python法两种。 一、VBA法提取word中…...

Swift Combine 有序的异步操作 从入门到精通十二
Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…...

国产航顺HK32F030M: 超声波测距模块串口通信数据接收与处理
参考代码 /************************************************************************************************** * file usart_async_tx_no_int_rx_rxneint.c * brief 异步串口通信例程, 通过查询TXE标志发送数据,通过RXNE中断接收数据,当中断接收到数据后会将 * …...

idea:如何连接数据库
1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填,用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库,点击运用ok,等待刷新即可 最后:…...
JS中ES5和ES6的区别
前言 ES5是JavaScript的第五个修订版本,于2009年发布。而ES6是JavaScript的第六个修订版本,也称为ES2015,于2015年发布。以下是它们两个版本之前的一些区别: 变量声明方式 在ES5中,使用var关键字进行变量声明&#…...

软考24-上午题-图1
一、数据结构的回忆 线性结构:(一对一) 除首结点没有前驱、末尾结点没有后继外,一个结点只有唯一的一个直接前驱和唯一的一个直接后继。 树结构:(一对多) 除根节点没有前驱节点外,…...

书生·浦语大模型第四课作业
基础作业: 构建数据集,使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手,效果如下图所示,本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称! 1.安装 # 如果你是在 Int…...

勒索攻击风起云涌,Sodinokibi深度分析
前言 Sodinokibi勒索病毒,又称为REvil勒索病毒,这款勒索病毒最早在国内被发现是2019年4月份,笔者在早期分析这款勒索病毒的时候就发现它与其他勒索病毒不同,于是被笔者称为GandCrab勒索病毒的“接班人”,为什么它是Ga…...
1124. 骑马修栅栏(欧拉路径,模板)
农民John每年有很多栅栏要修理。 他总是骑着马穿过每一个栅栏并修复它破损的地方。 John是一个与其他农民一样懒的人。 他讨厌骑马,因此从来不两次经过一个栅栏。 你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径…...

C# CAD2016获取数据操作BlockTableRecord、Polyline、DBObject
一、数据操作说明 //DBObject 基础类 DBObject dbObj (DBObject)tr.GetObject(outerId, OpenMode.ForRead); //Polyline 线段类 Polyline outerPolyline (Polyline)tr.GetObject(outerId, OpenMode.ForRead); //BlockTableRecord 块表类 BlockTableRecord modelSpace (Bloc…...

java SSM新闻管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
一、源码特点 java SSM新闻管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S…...

Linux_线程
线程与进程 多级页表 线程控制 线程互斥 线程同步 生产者消费者模型 常见概念 下面选取32位系统举例。 一.线程与进程 上图是曾经我们认为进程所占用的资源的集合。 1.1 线程概念 线程是一个执行分支,执行粒度比进程细,调度成本比进程低线程是cpu…...

【selenium】
selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的。Selenium可以直接调用浏览器,它支持所有主流的浏览器。其本质是通过驱动浏览器,完成模拟浏览器操作,比如挑战,输入,点击等。 下载与打…...

HX711压力传感器学习一(STM32)
目录 原理图: 引脚介绍: HX711介绍工作原理: 程序讲解: 整套工程: 发送的代码工程,与博客的不一致,如果编译有报错请按照报错和博客进行修改 原理图: 引脚介绍: VCC和GND引…...
作业2.13
1、选择题 1.1、若有定义语句:int a[3][6]; ,按在内存中的存放顺序,a 数组的第10个元素是 D A)a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 1.2、有数组 int a[5] {10,20,30,40,50},…...

ArcGIS学习(七)图片数据矢量化
ArcGIS学习(七)图片数据矢量化 通过上面几个任务的学习,大家应该已经掌握了ArcGIS的基础操作,并且学习了坐标系和地理数据库这两个非常重要且稍微难一些的专题。从这一任务开始,让我们进入到实战案例板块。 首先进入第一个案例一一图片数据矢量化。 我们在平时的工作学…...
G口大流量服务器选择的关键点有哪些?
G口服务器指的是接入互联网的带宽达到1Gbps以上的服务器,那么选择使用G口大流量服务器的用户需要注意哪些选择 关键点呢?小编为您整理关于G口大流量服务器的关键点。 G口服务器通常被用于需要大带宽支持的业务场景,比如视频流媒体、金融交易平台、电子商…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...