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