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

首頁

新聞資訊

論壇

溫哥華地產

大溫餐館點評

溫哥華汽車

溫哥華教育

黃頁/二手

旅游
搜索:  

 論壇通告:  請不要上傳第三方有版權的照片,請尊重版權,謝謝   轉載新聞請務必注明出處,這些媒體請不要轉,謝謝   批評商家需要注意  
 個人空間: XY | 羅蓬特機器人 | NotmeL8 | 豬頭看世界 | 顧曉軍 | 格局 | lxls | 客觀中立而實事求是,唯服理據而杜絕辱罵 | 一襲絳襦落鵬城,疑似玄女下九天 | 白龍王許道長 | 花隨風 | 呂洪來的個人空間 | 靜觀雲卷雲舒 | 逸言堂 | 大溫房產和地產研究 | 我的退休生活 | 禪人俗事 | 湖裡湖塗 | 天涯逐夢 | 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
    潛力帖子 精華帖子 熱門帖子
    粵語歌曲。二百八十二
    國語歌曲。二百二十九
    台語歌曲 。五十三
    飯都快吃不起了
    新加坡600萬人口勝過馬來西亞3300萬...
    外星人擴大交流:安分守己。
    印度軍事專家:印度陣風戰機在1:1對...
    烏軍收復哈爾科夫領土;川普將與大...
    GDP全球第二,假期全球倒數。這盛世...
    印度第四架陣風戰斗機被擊落女飛行...
    溫哥華警方說菲律賓節日開車撞人群...
    從發型看女人
    今天看眼醫
    哥德巴赫猜想
    金小胖咋沒去俄羅斯?
    5月2日換幣盛況
    維達大師,另類收藏,請您欣賞!
    清代福州台伏鈔票
    四川官錢局鈔票
    大漢四川軍政府軍用銀票
    今年新幣發行計劃
    要出一個新的一元
    古董金幣
    mint三月新幣(四月新幣從22樓起,五...
    1999 mule 25分
    2025 蛇年敲幣活動
    加拿大新總理馬克卡尼
    我在小紅書被罵窮得沒錢給孩子買衣服
    美國2025年AWQ(美國婦女25c)發行計劃
    韓國空難FDR黑匣子缺失最後四分鍾關...
    皮爾今天在溫哥華 - 藍色wave - 保...
    幾分鍾前,中國強硬反擊,征34+50,...
    曼谷高樓直接倒了
    我說我希望特朗普贏,老公氣得眼睛...
    知乎?加西網上為什麼有老男人喜歡...
    明明有能力統台,大陸為何遲遲不動手?
    貌似ndp稍占上風。。。。。
    今天是感恩節,跟大家道個別,以後...
    咱最後還是投了ndp
    生平第一次被偷車了
    中國會不會武統台灣
    突發:台灣隊戰勝中國隊奧運奪冠,...
    溫哥華房姐出事了
    有在看總統辯論的嗎?
    退休幾年後的感悟

    最新新聞 熱門新聞 熱評新聞
    為何突然停火? CNN:美國接獲"驚人情報"
    想把2歲兒賣掉創業 烏克蘭嫩媽遭判刑8年
    川普前美女官員上節目突暈倒 主持人嚇傻
    喝咖啡能減肥?科研初步結論是…
    紐約時報:印度空襲逼近巴國核武庫 逼美國出手
    科學家發現 茶葉鮮味流失的奧秘
    伊朗:若美國意圖剝奪其核權利 決不退讓
    烏克蘭外長:期待俄方對停火提議予以確認
    段暄時隔2年再度更新社媒,此前被控行賄950萬
    前空姐曝 乘坐飛機有這些潛規則
    要選對老板和方向!巴菲特:年輕人別太在意起薪
    007的新"上司M"將是她? 她通中文是中國專家
    愛犬被一口氣拔16顆牙死亡 求償460萬美元
    美國收到"令人震驚情報",范斯致電印度總理促停火
    普京提議俄烏直接談判,法國總統馬克龍回應
    暴漲超100%!34萬人"入圈",什麼這麼火?
    不只好喝 急診醫生曝可樂3大意想不到的妙用
    美元貶值才開始!他們對美元的拋售形成巨大壓力
    中國軍事科技戰力 首次得以在實戰中驗證
    5月11日追劇日歷,8部電視劇有更新,古裝劇《淮水竹亭》點映收官
    TVB《執法者們》開播,宣萱太抗老了!54歲仍單身,古天樂成依靠
    小龍女偷吃人夫"私密照外流"經紀公司強硬發聲
    巴西總統訪華 擬建橫貫南美"兩洋鐵路"
    多倫多頭巾女乞討卻開豪車:年8萬福利月賺5000
    鄧超給所有79年出生的人道歉 上熱搜第一
    盼他成救世主!海灣國家巨額投資迎川普
    大溫華裔車禍慘死 嫌犯就這樣沒事了
    服務員好日子到頭? 魁省小費新規狠 BC想抄作業
    游客手機被猴子搶走 撿回發現 拍得比自己好
    月薪4784 債務2544萬 深圳女申請破產 網民驚呆
    天上掉寶!印度收到中國軍事諜報大禮包
    開著新車街上討錢 加國人不淡定了
    傳中美瑞士貿易談判早上不歡而散
    關稅逼退中國商品 美西港口清空
    陸媒:短短一天,印巴局勢迎來大轉折 ...
    特朗普又反悔?這次要推動上調"超級富豪稅"
    第7次人口普查:中國剩男危機越發嚴重
    加國人悲慘困境:要麼等死,要麼自費去國外求醫
    大溫華人女子幹這事遭舉報+罰款$300!全網怒了
    美元貶值才開始!他們對美元的拋售形成巨大壓力
    中國軍事科技戰力 首次得以在實戰中驗證
    5月11日追劇日歷,8部電視劇有更新,古裝劇《淮水竹亭》點映收官
    TVB《執法者們》開播,宣萱太抗老了!54歲仍單身,古天樂成依靠
    小龍女偷吃人夫"私密照外流"經紀公司強硬發聲
    巴西總統訪華 擬建橫貫南美"兩洋鐵路"

    更多方式閱讀論壇:

    Android: 加西網
    [下載]

    Android: 溫哥華論壇
    [下載]

    PDA版本: 論壇

    加西網微信

    加西網微博


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

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

    頁面生成: 0.0509 秒 and 6 DB Queries in 0.0012 秒