| 廣告聯系 | 簡體版 | 手機版 | 微信 | 微博 | 搜索:
歡迎您 游客 | 登錄 | 免費注冊 | 忘記了密碼 | 社交賬號注冊或登錄

首頁

新聞資訊

論壇

溫哥華地產

大溫餐館點評

溫哥華汽車

溫哥華教育

黃頁/二手

旅游
搜索:  

 論壇通告:  請不要上傳第三方有版權的照片,請尊重版權,謝謝   轉載新聞請務必注明出處,這些媒體請不要轉,謝謝   批評商家需要注意  
 個人空間: lxls | XY | 豬頭看世界 | 格局 | NotmeL8 | 羅蓬特機器人 | 白龍王許道長 | 一襲絳襦落鵬城,疑似玄女下九天 | 花隨風 | 呂洪來的個人空間 | 靜觀雲卷雲舒 | 顧曉軍 | 客觀中立而實事求是,唯服理據而杜絕辱罵 | 逸言堂 | 大溫房產和地產研究 | 我的退休生活 | 禪人俗事 | 湖裡湖塗 | 天涯逐夢 | My AI Tech Channel
 最新求助: 請問誰知道哪裡有賣理發的電動推子?   忽然有個疑問:戰爭時期,加拿大拿PR卡未入籍的永久居民會被強制服兵役嗎?   這個銀條   如何修改會員名?
 論壇轉跳:
     發帖回帖獲取加西鎊, 兌換精彩禮物

論壇首頁 -> IT人生

轉貼:為什麼Actor模型是高並發事務的終極解決方案? (發表於10年前)



回復主題  圖片幻燈展示  增添帖子到書簽中  給帖子中的發貼者批量贈送獻花或者花籃    |##| -> |=|        發表新主題
閱讀上一個主題 :: 閱讀下一個主題  
作者 正文
webdriver
(只看此人)




文章 時間: 2014-10-17 12:59 引用回復
首先看看道友提出的一個問題:
用戶甲的操作
1.開始事務
2.訪問表A
3.訪問表B
4.提交事務
乙用戶在操作
1.開始事務
2.訪問表B
3.訪問表A
4.提交事務

如果甲用戶和乙用戶的兩個事務同時發生,甲事務鎖住了表A未釋放(因為整個事務未完成),正在准備訪問B表,而乙事務鎖住了表B未釋放(因為整個事務未完成),正在准備訪問A表,可是A表被甲事務鎖住了,等甲事務釋放,而甲事務真正等待乙事務釋放B表,陷入了無限等待,也就是死鎖Dead Lock。

也有道友使用多線程來模擬存儲過程:http://www.jdon.com/45727,每個線程裡開啟一個事務,類似上述問題也會出現死鎖。

問題出在哪裡?
 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
樓主 | 電梯直達
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
webdriver
(只看此人)




文章 時間: 2014-10-17 12:59 引用回復
是我們的思路方向出現問題:

其實無論是使用數據庫鎖 還是多線程,這裡有一個共同思路,就是將數據喂給線程,就如同計算機是一套加工流水線,數據作為原材料投入這個流水線的開始,流水線出來後就是成品,這套模式的前提是數據是被動的,自身不復雜,沒有自身業務邏輯要求。適合大數據處理或互聯網網站應用等等。

但是如果數據自身要求有嚴格的一致性,也就是事務機制,數據就不能被動被加工,要讓數據自己有行為能力保護實現自己的一致性,就像孩子小的時候可以任由爸媽怎麼照顧關心都可以,但是如果孩子長大有自己的思想和要求,他就可能不喜歡被爸媽照顧,他要求自己通過行動實現自己的要求。

數據也是如此。

只有我們改變思路,讓數據自己有行為維護自己的一致性,才能真正安全實現真正的事務。

數據+行為=對象,有人問了,對象不是也要被線程調用嗎?
 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
沙發 | 返回頂端
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
webdriver
(只看此人)



文章 時間: 2014-10-17 13:00 引用回復
例如下述代碼,因為對象的行為要被線程調用,我們要使用同步鎖synchronized :
代碼:

public class A {
        private volatile int lower, upper; //兩個狀態值
        public int getLower() { return lower; }
        public int getUpper() { return upper; }
        public synchronized void setAUpper(int value){
             if (value < a.getUpper())
                    a.setLower(value);
        }

        public asynchronization void setALower(int value){
            if (value > a.getLower())
                   a.setUpper(value);
         }
   }


上面這段代碼業務邏輯是想實現lower<upper:

1. lower和upper的初始值是(0, 5),
2.一個客戶端請求線程A: setLower(4)
一個客戶端請求線程B: setUpper(3)
3. lower和upper是 (4, 3)

這個結果破壞了lower<upper這個邏輯一致性,所以,用鎖並不能保證邏輯一致性,而且還帶來了堵塞。鎖用錯了地方,不但沒有得到想要的,而且還失去更多。
 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
板凳 | 返回頂端
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
webdriver
(只看此人)



文章 時間: 2014-10-17 13:01 引用回復
下圖展示了鎖帶來堵塞,每個時刻只能允許一個線程工作,如同只能允許一個人蹲馬桶一樣。

 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
地板 | 返回頂端
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
webdriver
(只看此人)



文章 時間: 2014-10-17 13:01 引用回復
從歷史上看,鎖的問題如鬼魂一直伴隨著我們:
1.用數據表一個字段來表示狀態,比如1表示已付款未發貨,2表示已付款已發貨,然後用戶來一個請求用SQL或存儲過程修改,這時使用的數據庫鎖。

2.用ORM實現,比如Hibernate JPA來修改狀態,雖然不用SQL了,但是Hibernate的悲觀鎖和樂觀鎖也讓人抓狂。

3.徹底拋棄數據庫,直接在內存緩存中進行修改,使用Java的同步鎖,性能還是不夠,吞吐量上不去。如上圖提示,只能一個廁所蹲位一個人用,其他人必須排隊。
 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
5 樓 | 返回頂端
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
webdriver
(只看此人)



文章 時間: 2014-10-17 13:02 引用回復
4.Actor模型。

Actor模型原理
Actor模型=數據+行為+消息。

Actor模型內部的狀態由自己的行為維護,外部線程不能直接調用對象的行為,必須通過消息才能激發行為,這樣就保證Actor內部數據只有被自己修改。
 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
6 樓 | 返回頂端
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
webdriver
(只看此人)



文章 時間: 2014-10-17 13:02 引用回復
Actor模型如何實現?

Scala或ErLang的進程信箱都是一種Actor模型,也有Java的專門的Actor模型,這裡是幾種Actor模型比較

明白了Actor模型原理,使用Disruptor這樣無鎖隊列也可以自己實現Actor模型,讓一個普通對象與外界的交互調用通過Disruptor消息隊列實現,比如LMAX架構就是這樣實現高頻交易,從2009年成功運行至今,被Martin Fowler推崇。

回到本帖最初問題,如何使用Actor模型解決高並發事務呢?

轉賬是典型的符合該問題的案例,轉賬是將A帳號到B帳號轉賬,使用Actor模型解決如下:

發出是否可轉出消息--->消息隊列--->A

A作為一個對象,注意不是數據表,對象是有行為的,檢查自己余額是否可轉賬,如果可以,凍結這部分金額,比如轉賬100元,凍結100元,從余額中扣除。因為外部命令是通過消息順序進來的,所以下一個消息如果也是扣除,再次檢查余額是否足夠......

具體詳細流程可見:REST和DDD
 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
7 樓 | 返回頂端
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
webdriver
(只看此人)



文章 時間: 2014-10-17 13:02 引用回復
那麼,既然Actor模型如此巧妙,而解決方向與我們習慣的數據喂機器的方式如此不同,那麼如何在實戰中能明顯發現某個數據修改應該用Actor模型解決呢?因為我們習慣將數據喂機器的思路啊?

使用DDD領域驅動設計或CQRS架構就能明顯發現這些特殊情況,CQRS是讀寫分離,其中寫操作是應領域專家要求編寫的功能,在這類方向,我們都有必要使用Actor模型實現,因為在這個方向上,領域專家的要求都表達為聚合根實體,聚合根就是用Actor模型實現最合適不過了。而讀方向,比如大數據處理,報表查詢,OLTP等等都是數據喂機器的方式。

有的道友會疑問,我們經常使用SSH,也就是Spring + Hibernate架構,這個默認是哪種方向呢?很顯然,默認是數據喂機器的方向,所以在實現寫操作時,特別警惕高並發發生死鎖等影響性能問題,當然也包括EJB架構。

有一種togaf架構,將企業軟件架構分為數據架構和應用架構等,實際是EJB或SSH的變相描述,這種架構的問題我們已經一目了然了,特別這樣的系統如果從面向內部管理轉向到SaaS模型時,這類高並發死鎖問題就特別容易發生,幾乎不具備可用性。前期12306火車票系統是這類問題的典型體現。

(the end)
 
花籃
分享
_________________
There is no wisdom tree; nor a stand of a mirror bright, Since all is void, where can the dust alight?
8 樓 | 返回頂端
閱讀會員資料 發送站內短信 主題 User photo gallery 禮物  
 
回復主題     |##| -> |=|     論壇首頁 -> IT人生 所有的時間均為 美國太平洋時間
1頁,共1


注:
  • 以上論壇所有發言僅代表發帖者個人觀點, 並不代表本站觀點或立場, 加西網對此不負任何責任。
  • 投資理財及買房賣房版面的帖子不構成投資建議。投資有風險,責任請自負
  • 對二手買賣中的虛假信息,買賣中的糾紛等均與本站無關。
  • 黃頁熱門商家 免費個人廣告
    發布商業廣告

    不能在本論壇發表新主題
    不能在本論壇回復主題
    不能在本論壇編輯自己的文章
    不能在本論壇刪除自己的文章
    不能在本論壇發表投票
    不能在這個論壇添加附件
    可以在這個論壇下載文件

    論壇轉跳: 

    webdriver, webdriver, webdriver, webdriver, webdriver, webdriver, webdriver, webdriver
    潛力帖子 精華帖子 熱門帖子
    莫斯科衛國戰爭勝利80周年閱兵實況...
    應該軍事雜志介紹一下
    中俄聯合聲明
    殲十多了個名號
    的確不太好,但是挺逗的!
    中國高鐵牛啊
    飯都快吃不起了
    個人認為很危險的想法
    巴印空戰0比6之啟示
    陰雨天回來了
    今天看眼醫
    從發型看女人
    中國簽證的問題?
    紅場閱兵大陸儀仗登熱搜,普京朋友...
    加拿大允許國內郵寄肉食品了
    5月2日換幣盛況
    維達大師,另類收藏,請您欣賞!
    清代福州台伏鈔票
    四川官錢局鈔票
    大漢四川軍政府軍用銀票
    今年新幣發行計劃
    要出一個新的一元
    古董金幣
    mint三月新幣(四月新幣從22樓起,五...
    1999 mule 25分
    2025 蛇年敲幣活動
    加拿大新總理馬克卡尼
    我在小紅書被罵窮得沒錢給孩子買衣服
    美國2025年AWQ(美國婦女25c)發行計劃
    韓國空難FDR黑匣子缺失最後四分鍾關...
    皮爾今天在溫哥華 - 藍色wave - 保...
    幾分鍾前,中國強硬反擊,征34+50,...
    曼谷高樓直接倒了
    我說我希望特朗普贏,老公氣得眼睛...
    知乎?加西網上為什麼有老男人喜歡...
    明明有能力統台,大陸為何遲遲不動手?
    貌似ndp稍占上風。。。。。
    今天是感恩節,跟大家道個別,以後...
    咱最後還是投了ndp
    生平第一次被偷車了
    中國會不會武統台灣
    突發:台灣隊戰勝中國隊奧運奪冠,...
    溫哥華房姐出事了
    有在看總統辯論的嗎?
    退休幾年後的感悟

    最新新聞 熱門新聞 熱評新聞
    全美高校被AI羞恥攻陷:AI必將殺死人文學科
    新任教皇:兩次罵萬斯,一次罵川普
    中美貿易談判前,北京突然出手警告川普
    超糗:情侶海裡愛愛 竟然分不開(圖
    第2個?美商務部長曝這國接棒達成貿易協議
    溫村著名房地產公司Rennie裁31人
    二戰結束80年 "台灣籍日本兵"的雙重身份認同之爭
    克宮:普京川普透過幕僚相互賀 金正恩赴俄使館道賀
    美國上空出現神秘黑圓環 居民:從來沒見過
    溫市居民最近去美國感到不受歡迎
    加州兩大煉油廠宣布關閉 真要全民換電車?
    點名中俄朝 美海軍中將:10年內造新型核導彈
    中國人造太陽發源地已建起中國核聚變博物館
    西瓜甜嗎?中國鑒瓜師3秒判別 收入驚呆網友
    莫斯科全城斷網閱兵 普京絕不允許紅場有失
    杭州胖都來風波後續!三德子率先道歉,丁勇岱...
    "挺陸配"與"護兒"活動10日齊登場 網紅專家都示
    松下擬全球裁員1萬人 海外裁員人數占5000人
    49歲素顏殺瘋同學會 蔣勤勤憑啥美成時光刺客?
    美軍從越南撤退50年後,中國已"接管"亞洲
    日本秩父春景如畫 徜徉於叢生福祿考花海之中
    鍾楚曦太會穿了 白色吊帶裙下面不穿喇叭褲
    章澤天帶9歲女兒參加音樂節 被誇贊親切又溫柔
    波蘭前模特兒索科拉作證 16歲遭哈維溫斯坦性侵
    美中將於瑞士會談 美方尋求降關稅與解除稀土管制
    選出首位美籍教宗 分析﹕中梵關系或添變數
    乘客突發急病,醫生為何選擇不救?
    車曉離婚13年:熱衷美食、化妝,活成了中年少女
    室友電池爆炸燒傷的大學生,絕望深淵裡唱歌
    影後金雅琴患雙癌離世:獨生女兒4婚4離,她氣...
    加國消減留學名額 院校五千人失業
    "疫苗導致的死亡海嘯已經來臨" 中國博主發文
    王丹:中國為何這麼快就與美談判?
    加拿大的國會要重開 這個黨尷尬了
    中國憂心"2下場"!選擇對美讓步(圖
    紀念蘇聯偉大衛國戰爭勝利80周年,紀念的是什麼?
    租了11年的房子要賣 大溫女子忠告
    英媒:比黃金還珍貴的月塵從中國運抵英國
    "太濕了先暫停一下" 人妻偷吃小王簡訊被發現
    獨家報道傳 川普最快下周將中國關稅降至…
    多個大國無視中共紅線! 北京體面遭踐踏
    中國體制內人員,欠薪風暴越刮越猛
    中國"仍然占上風" 語氣相當強硬
    壓軸登場、長長紅地毯....習在莫斯科享盡榮耀
    加拿大皇家馬戲團素裡列治文開演

    更多方式閱讀論壇:

    Android: 加西網
    [下載]

    Android: 溫哥華論壇
    [下載]

    PDA版本: 論壇

    加西網微信

    加西網微博


    Powered by phpBB 2.0.8
    Terms & Conditions    Privacy Policy    Political ADs    Activities Agreement    Contact Us    Sitemap    

    加西網為北美中文網傳媒集團旗下網站

    頁面生成: 0.0510 秒 and 7 DB Queries in 0.0018 秒