關于在分布式環境中RVN和使用場景的介紹4

簡介

在前面的文檔中,我們介紹了RVN的概念,通過RVN可以解決的某類問題和使用技巧,以及處理RVN的邏輯的具體實現。在本文中,我們將要介紹關于如何使用RVN解決另一種在分布式系統中常出現的問題。

問題

假設我們創建了一個service來維護某種record。我們的service允許client獲取record,并且基于現有record的內容對record進行修改。舉例說,假設我們的record記錄了client一方的某種操作的數量。Client每完成一次操作就將service一側的count加1。當然我們有其它的方法,但是我們現在要求count的計算部分在client一側完成。具體來說,我們的record可以定義為:

Record {int ID;int count;
}

Service提供的API 為:

void updateRecord(Record record);

但是在分布式系統中,可能有多個client同時試圖更新同一個record,這樣這兩個client的update就會互相覆蓋,從而使最終的結果錯誤。例如在下圖,我們數據庫中保存的ID “1”的數量是10。現在有兩個client同時獲取了這個記錄,然后同時試圖將數量改為11。最終兩個帶有11的結果將互相覆蓋,從而我們錯誤的保存了11,而不是12。我們將如何避免這個問題?

解決方法

這個問題同樣可以使用RVN來解決。具體來說,我們在record里加入RVN,代表某條記錄的版本號。對于每次更新,client都要先獲取當前記錄以及它的版本號,然后將版本號加1寫入到update record的request里。而service端需要檢查request的RVN,確保該RVN大于當前保存的保本好,最后再將該記錄和RVN寫入到數據庫。我們詳細描述該過程如下:

現在client1和client2都獲取了RVN為1的記錄,然后都將RVN更新為2,發送request去試圖更新service一側的數據。Service一側的邏輯如下:

在這里我們需要特別說明幾點。為了保證處理的正確性,service必須保證在處理record的過程中RVN一直是合理的,否則就可能出現兩個thread都認為自己的RVN是正確的,從而仍然互相覆蓋。這樣我們可以使用lock住record的ID,并且在處理完record之后再unlock,來保證處理的正確性。我們也可以使用DynamoDB的condition update來達到相同的目的,具體可以參見《關于在分布式環境中RVN和使用場景的介紹3》。

在這種邏輯下,后獲得鎖的thread將會發現它所持有的RVN已經不是合理的RVN了,所以它會拒絕處理它持有的request,并且向client匯報這一情況(比如可以throw exception)。而client可以重新從service獲得最新的RVN的record,再次嘗試根據最新的記錄進行更新。

問題擴展

在我們討論的解決方案里,我們期望service和client可以遵守共同的規則在一起工作,比如期望所有的client都可以基于獲取的RVN每次增加1。只有在這種情況下,我們的數據才能被維護正確。假如,我們的API是公開的API,也就是說client并不總是可信的。Client可能會破壞規則給RVN增加2或者更多來試圖非法獲取修改數據的規則。在這種情況下,我們可以給每一個record version生成一個UUID來代替RVN。Client必須提供當前version的UUID以獲取修改當前record的資格。在每次record被改變時都生成新的UUID。

參考文檔

《關于在分布式環境中RVN和使用場景的介紹1》

《關于在分布式環境中RVN和使用場景的介紹2》

《關于在分布式環境中RVN和使用場景的介紹3》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697737.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697737.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言—自定義(構造)類型

2.20,17.56 1.只有當我們使用結構體類型定義變量/結構體數組,系統才會為結構體的成員分配內存空間,用于存儲對應類型的數據 2.strct 結構體 一起作為結構體類型標識符 嘿嘿暫時先這樣,我會回來改的1、定義一個表示公交線路的結構體,要…

pikachu靶場-CSRF

CSRF: 介紹: Cross-site request forgery簡稱為"CSRF”。 在CSF的攻擊場景中攻擊者會偽造一個請求(這個請求一般是一個鏈接) 然后欺騙目標用戶進行點擊,用戶一旦點擊了這個請求,整個攻擊也就完成了&#xff0…

VSCode-更改系統默認路徑

修改vscode中的默認擴展路徑:"%USERPROFILE%\.vscode" 打開目錄C:\用戶\電腦用戶名,將.vscode文件剪切至D:\VSCode文件夾下 用管理員身份打開cmd.exe命令界面輸入mklink /D "%USERPROFILE%\.vscode" "D:\VSCode\.vscode\"…

同一個包下 golang run時報undefined

問題描述 今天在運行一個項目,一個包下有兩個文件,分別是main.go和route,main函數在main.go文件中,main引用了route.go中的兩個函數,SetupRoutes和SetupAdminRoutes go build 編譯后,直接運行&#xff0c…

【C++私房菜】面向對象中的簡單繼承

文章目錄 一、 繼承基本概念二、派生類對象及派生類向基類的類型轉換三、繼承中的公有、私有和受保護的訪問控制規則四、派生類的作用域五、繼承中的靜態成員 一、 繼承基本概念 通過繼承(inheritance)聯系在一起的類構成一種層次關系。通常在層次關系的…

Leetcoder Day17| 二叉樹 part06

語言:Java/C 654.最大二叉樹 給定一個不含重復元素的整數數組。一個以此數組構建的最大二叉樹定義如下: 二叉樹的根是數組中的最大元素。左子樹是通過數組中最大值左邊部分構造出的最大二叉樹。右子樹是通過數組中最大值右邊部分構造出的最大二叉樹。 …

進程間傳遞 SQL 文的方法

SQL 文組成 SQL 文有 2 部分組成: SQL 原型,如:INSERT INTO test1 (id,name) VALUES (?,?)Args ,? 號對應的值列表 有時,生成 SQL 文的進程和處理 SQL 文的進程,可能不是同一個 這里就涉及到如何高效…

免費搭建個人網盤

免費搭建一個屬于個人的網盤。 服務端 詳情請參考原網站的服務端下載和安裝虛擬磁盤Fuse4Ui可以支持把網盤內容掛載成系統的分區; 掛載工具效果圖:應用端應用端的下載 效果圖

藍橋杯第1374題——鍛造兵器

題目描述 小明一共有n塊鍛造石,第塊鍛造石的屬性值為ai. 現在小明決定從這n塊鍛造石中任取兩塊來鍛造兵器 通過周密計算,小明得出,只有當兩塊鍛造石的屬性值的差值等于C,兵器才能鍛造成功 請你幫小明算算,他有多少種選…

人工智能幾個關鍵節點:深藍,AlphaGo,ChatGPT,Sora

近30年,人工智能幾個關鍵節點:深藍,AlphaGo,ChatGPT,Sora 深藍: 1997年,深藍擊敗卡斯帕羅夫的比賽是通過一系列復雜的算法和策略實現的。深藍的開發團隊使用了一種名為“暴力搜索”的技術&…

OGG-00918 映射中缺少鍵列 id.

2024-02-23 14:54:49 INFO OGG-02756 從線索文件獲取了表 GISTAR.PXPH_PON_ROUTE 的定義。. The following columns did not default because of type mismatches: id OGG-00918 映射中缺少鍵列 id. 目標端有字段ID,由于mysql自增,所以只能是b…

短劇小程序系統,重塑視頻觀看體驗的科技革命

隨著科技的飛速發展,人們對于數字化內容的消費需求也在不斷增長。在這個大背景下,短劇小程序作為一種新型的視頻觀看方式,正逐漸受到大眾的青睞。本文將探討短劇小程序的發展背景、特點以及市場前景,分析其在重塑視頻觀看體驗方面…

如何使用Inno Setup制作Unity構建程序的Windows安裝程序

1. 準備 (1)準備好Unity構建的程序集合 必須包括: Data文件夾(xxx_Data) Mono文件夾(MonoBleedingEdge) 打包的應用程序文件(xxx.exe) Unity播放器dll文件&#xff…

SpringBoot+Docker:高效容器化的最佳實踐

首先為什么要使用 Docker? Docker 是一個強大的工具,它允許開發者將他們的應用程序打包到容器中,以便可以在任何平臺上輕松部署和運行。當涉及到對 Spring Boot 應用程序進行 Docker 化時,每個開發人員都應該遵循一些最佳實踐&am…

編程筆記 Golang基礎 017 數據類型:字符串類型

編程筆記 Golang基礎 017 數據類型:字符串類型 一、字符串類型小結 在Go語言中,字符串(string)是一種基本的數據類型,用于表示文本數據。它是一個不可變的字符序列,由UTF-8編碼的字節組成,支持U…

深入URP之Shader篇15: Shader關鍵字和變體

之前說了很多shader關鍵字的事情,本篇好好說一下關鍵字和變體。 關鍵字是干什么的 我們寫shader的時候,經常會遇到需要處理不同的情況,比如是否啟用霧,光源是平行光還是點光源,是否使用法線貼圖等等。如果為每一種情…

基于springboot+vue的大創管理系統(前后端分離)

博主主頁:貓頭鷹源碼 博主簡介:Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰,歡迎高校老師\講師\同行交流合作 ?主要內容:畢業設計(Javaweb項目|小程序|Pyt…

【selenium】執行 Javascript 腳本 滾動、元素的特殊操作等

某些特殊情況下,使用selenium的api無法操作頁面元素,點擊、滾動實現的某些功能,可以考慮通過執行js來完成。 為什么不用js寫自動化?——selenium第一版是js寫的,但js兼容性存在問題,所以引入webdriver 現在…

ad15 PCB3D模型導出到SOLIDWORKS

注意,工程文件目錄不能用中文,否則導出的文件會不存在 將這個文件直接拖到 SOLIDWORKS 中 下一步很關鍵 顯示出來了 另存為一個轉配體就可以了

12 個對開發人員有用的 Python 腳本

目錄 Create strong random passwordsExtract text from a PDFText processing with PandocManipulate audio with PydubFilter textLocate addressesConvert a CSV to ExcelPattern match with regular expressionsConvert images to JPGCompress imagesGet content from Wiki…