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

关于在分布式环境中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需要注意的问题。 问题 我们在收到一条待处理的事件时&#xff0c;需要检查该…...

计算最小公倍数math.lcm()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算最小公倍数 math.lcm() 请问以下代码输出的结果是&#xff1f; import math print("【执行】math.lcm(2, 4)") print(math.lcm(2, 4)) print("【执行】math.lcm(1, 2, 3…...

VUE SEO 几种方案经典面试题

1、SSR服务器渲染 Vue.js 是构建客户端应用程序的框架。默认情况下&#xff0c;可以再浏览器中输出Vue组件&#xff0c;进行生成DOM和操作DOM。然而&#xff0c;也可以将同一个组件渲染未服务器端的HTML字符串&#xff0c;将它们直接发送到浏览器&#xff0c;最后将这些静态标…...

Python和VBA批量提取Word中的表格

表格在word文档中常见的文档元素之一。操作word文件时有时需要提取文件中多个表格的内容到一个新的文件&#xff0c;甚至有时还会要提取题注信息。 今天&#xff0c;给大家分享两种批量提取文档中表格的两种方法&#xff0c;分别是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、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…...

JS中ES5和ES6的区别

前言 ES5是JavaScript的第五个修订版本&#xff0c;于2009年发布。而ES6是JavaScript的第六个修订版本&#xff0c;也称为ES2015&#xff0c;于2015年发布。以下是它们两个版本之前的一些区别&#xff1a; 变量声明方式 在ES5中&#xff0c;使用var关键字进行变量声明&#…...

软考24-上午题-图1

一、数据结构的回忆 线性结构&#xff1a;&#xff08;一对一&#xff09; 除首结点没有前驱、末尾结点没有后继外&#xff0c;一个结点只有唯一的一个直接前驱和唯一的一个直接后继。 树结构&#xff1a;&#xff08;一对多&#xff09; 除根节点没有前驱节点外&#xff0c;…...

书生·浦语大模型第四课作业

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

勒索攻击风起云涌,Sodinokibi深度分析

前言 Sodinokibi勒索病毒&#xff0c;又称为REvil勒索病毒&#xff0c;这款勒索病毒最早在国内被发现是2019年4月份&#xff0c;笔者在早期分析这款勒索病毒的时候就发现它与其他勒索病毒不同&#xff0c;于是被笔者称为GandCrab勒索病毒的“接班人”&#xff0c;为什么它是Ga…...

1124. 骑马修栅栏(欧拉路径,模板)

农民John每年有很多栅栏要修理。 他总是骑着马穿过每一个栅栏并修复它破损的地方。 John是一个与其他农民一样懒的人。 他讨厌骑马&#xff0c;因此从来不两次经过一个栅栏。 你必须编一个程序&#xff0c;读入栅栏网络的描述&#xff0c;并计算出一条修栅栏的路径&#xf…...

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设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…...

Linux_线程

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

【selenium】

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

HX711压力传感器学习一(STM32)

目录 原理图&#xff1a;​ 引脚介绍&#xff1a; HX711介绍工作原理: 程序讲解&#xff1a; 整套工程&#xff1a; 发送的代码工程&#xff0c;与博客的不一致&#xff0c;如果编译有报错请按照报错和博客进行修改 原理图&#xff1a; 引脚介绍&#xff1a; VCC和GND引…...

作业2.13

1、选择题 1.1、若有定义语句&#xff1a;int a[3][6]; &#xff0c;按在内存中的存放顺序&#xff0c;a 数组的第10个元素是 D A&#xff09;a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 1.2、有数组 int a[5] {10&#xff0c;20&#xff0c;30&#xff0c;40&#xff0c;50},…...

ArcGIS学习(七)图片数据矢量化

ArcGIS学习(七)图片数据矢量化 通过上面几个任务的学习,大家应该已经掌握了ArcGIS的基础操作,并且学习了坐标系和地理数据库这两个非常重要且稍微难一些的专题。从这一任务开始,让我们进入到实战案例板块。 首先进入第一个案例一一图片数据矢量化。 我们在平时的工作学…...

G口大流量服务器选择的关键点有哪些?

G口服务器指的是接入互联网的带宽达到1Gbps以上的服务器&#xff0c;那么选择使用G口大流量服务器的用户需要注意哪些选择 关键点呢?小编为您整理关于G口大流量服务器的关键点。 G口服务器通常被用于需要大带宽支持的业务场景&#xff0c;比如视频流媒体、金融交易平台、电子商…...

百度网盘macOS版加速插件完全指南:三步破解限速限制

百度网盘macOS版加速插件完全指南&#xff1a;三步破解限速限制 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 你是否也曾面对百度网盘macOS版那令人绝…...

无王无帝定乾坤,来自田间第一人 海棠藏圣定山河

无王无帝定乾坤&#xff0c;来自田间第一人。 自古山河安定&#xff0c;世人皆归功于帝王镇守、朝堂统御&#xff0c; 仿佛万里乾坤唯有王权可镇、唯有霸业可安。 然则山河气运自有天道&#xff0c;世间安定自有公理&#xff0c; 强权只能维系一时疆域&#xff0c;正道方能稳固…...

FanControl终极指南:5步打造Windows电脑静音散热系统

FanControl终极指南&#xff1a;5步打造Windows电脑静音散热系统 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…...

从Neuralangelo看多分辨率哈希编码:如何用‘数值梯度’和‘渐进优化’搞定高保真3D重建?

Neuralangelo与多分辨率哈希编码&#xff1a;高保真3D重建的技术革命 在数字孪生、虚拟制作和文化遗产保护等领域&#xff0c;对真实世界进行高保真3D重建的需求从未如此迫切。传统摄影测量技术受限于硬件成本和算法瓶颈&#xff0c;难以平衡细节精度与处理效率。而神经渲染技术…...

HPM6750 RISC-V高性能MCU开发实战:从双核应用到图形加速

1. 项目概述与核心价值最近几年&#xff0c;RISC-V架构在嵌入式领域的声量越来越大&#xff0c;从最初的学术研究到如今在工业控制、边缘计算等场景的落地&#xff0c;生态的成熟度肉眼可见。作为一名长期混迹在嵌入式开发一线的工程师&#xff0c;我对于新架构、新平台总是抱有…...

英雄联盟个人信息修改终极指南:3分钟学会LeaguePrank完整使用教程

英雄联盟个人信息修改终极指南&#xff1a;3分钟学会LeaguePrank完整使用教程 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否厌倦了英雄联盟中千篇一律的个人资料显示&#xff1f;想向好友展示一个与众不同的游戏身份吗…...

Kali Linux 保姆级教程|从入门到渗透测试,一篇封神!

前言 Kali Linux 作为网络安全领域的「瑞士军刀」&#xff0c;集成 600 专业渗透工具&#xff0c;覆盖信息收集、漏洞利用、权限维持等全流程。本文结合最新实战场景&#xff0c;整理系统学习路径、核心工具解析及资源获取方式&#xff0c;助你快速掌握这门渗透测试必备技能。…...

终极Elsevier审稿追踪指南:5分钟实现智能投稿监控的完整方案

终极Elsevier审稿追踪指南&#xff1a;5分钟实现智能投稿监控的完整方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为Elsevier期刊投稿后的漫长等待而焦虑吗&#xff1f;每天反复登录系统查看审稿进度&…...

量子纠缠认证协议原理与工程实践

1. 量子纠缠认证协议的核心原理量子纠缠作为量子力学最反直觉的现象之一&#xff0c;在信息安全领域展现出独特优势。当两个量子比特形成贝尔态时&#xff0c;无论相隔多远&#xff0c;对其中一个粒子的测量会瞬间决定另一个粒子的状态。这种非局域关联特性&#xff0c;成为构建…...

【技术解析】从点测量到全场感知:DIC三维应变测量如何革新传统应变片测试范式

1. 从点到面的技术革命&#xff1a;为什么我们需要全场应变测量&#xff1f; 记得我第一次接触材料力学测试时&#xff0c;导师让我用传统应变片测量一块铝合金板的拉伸变形。我花了整整三天时间&#xff0c;在试样上贴了二十多个应变片&#xff0c;结果数据还是支离破碎。那时…...