論壇首頁
-> 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?
樓主 |
電梯直達
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?
沙發 |
返回頂端
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?
板凳 |
返回頂端
webdriver (只看此人 )
地板 |
返回頂端
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 樓 |
返回頂端
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 樓 |
返回頂端
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 樓 |
返回頂端
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 樓 |
返回頂端
論壇首頁
-> IT人生
所有的時間均為 美國太平洋時間
第1 頁,共1 頁
注:以上論壇所有發言僅代表發帖者個人觀點, 並不代表本站觀點或立場, 加西網對此不負任何責任。 投資理財及買房賣房版面的帖子不構成投資建議。投資有風險,責任請自負 對二手買賣中的虛假信息,買賣中的糾紛等均與本站無關。
您不能 在本論壇發表新主題 您不能 在本論壇回復主題 您不能 在本論壇編輯自己的文章 您不能 在本論壇刪除自己的文章 您不能 在本論壇發表投票 您不能 在這個論壇添加附件 您可以 在這個論壇下載文件
論壇轉跳:
選擇一個論壇
焦點板塊
加西知乎
發布求助
買房賣房
美麗的菲沙河谷
地產投資
加西菜園
商海微瀾
租房那些事兒
加國一家親
咱們本拿比
溫哥華不眠夜
日月當空
休閒Langley
菩提樹下
神愛世人
素裡新家園
白石華人
歌聲響起
讀書沙龍
單身情緣
新時代之光
歡迎來新西敏
我愛列治文
高貴林的朋友們
中英雙語班在Walton Elementary
生活互助
法律探索
醫療健康
准備養老
佛道淨土.中醫養生
天下收藏
減肥
投資理財
親子教育
豬寶寶俱樂部
汽車天地
溫村Jeep之家
錢幣交流小站 (Coin Community)
免費個人廣告
會員之家
北美盾之家
流協
吃喝與玩樂
玩玩樂樂
加西群英游艇會
結伴旅游
跳舞俱樂部
北美Hiking
吃吃喝喝
社團之窗
南粵茶居
交通大學校友會
福建同鄉在此聚集
加拿大四川同鄉聯誼會
同濟大學溫哥華校友會
精彩貼圖
精彩連環畫
開心一笑
國家與城市
新聞時評
軍事天地
教師罷工
大溫市選
情系中國
綿綿鄉音
香港占中
嶺南人家
悠悠華夏
只剛上海話
西雅圖夜未央
愛好與沙龍
原創原地
攝影交流
白石鎮攝影交流
視聽世界
瘋人院 - 你的喜鵲巢
電子電玩
Twitter 交流
蘋果樂園
android的星空
無限手機計劃
部落沖突
大數據論壇
網站建設
顛覆小組—LINUX
IT人生
iTalkBB討論組
English Corner
生活與教育
美好家居
精致生活
移民資訊
溫哥華留學
寵物樂園
致富與創業
精明消費
炫彩珠寶
南下購物
創業沙龍
職場風雲
運動與休閒
羽毛球場
高爾夫俱樂部
休閒運動
加西滑雪俱樂部
加西游泳俱樂部
武術之家
國家台球事務辦公室
加西圍棋俱樂部
網球天地
癡迷足球
乒乓球場
年青人天地
周末娛樂
美酒咖啡
彩妝
西餐美食
溫哥華高爾夫
webdriver, webdriver, webdriver, webdriver, webdriver, webdriver, webdriver, webdriver
最新新聞
熱門新聞
熱評新聞
為何突然停火? 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歲仍單身,古天樂成依靠
小龍女偷吃人夫"私密照外流"經紀公司強硬發聲
巴西總統訪華 擬建橫貫南美"兩洋鐵路"