高併發分佈式事務解決之道-Actor模型(附Akka與Reactor比較)

----- Actor模型

(1) 事務機制來由
爲什麼大多數互聯網軟件都是數據喂機器,或函數式即可,比如twitter或facebook,因爲他們沒有事務要求,一般涉及到錢等重要交易都需要事務,也可以這麼說,非結構化的數據一般都沒有事務要求,結構化聚合的數據纔有事務要求。

(2) 事務例子
用戶甲的操作
1.開始事務
2.訪問表A
3.訪問表B
4.提交事務
乙用戶在操作
1.開始事務
2.訪問表B
3.訪問表A
4.提交事務 
如果甲用戶和乙用戶的兩個事務同時發生,甲事務鎖住了表A未釋放(因爲整個事務未完成),正在準備訪問B表,而乙事務鎖住了表B未釋放(因爲整個事務未完成),正在準備訪問A表,可是A表被甲事務鎖住了,等甲事務釋放,而甲事務真正等待乙事務釋放B表,陷入了無限等待,也就是死鎖Dead Lock。

(3) 高併發事務解決之道
悲觀鎖 - 數據庫表鎖或行鎖
樂觀鎖 - 版本控制
同步鎖 - 單線程
Actor模型 - 行爲消息隊列(適用跨節點、分佈式、高併發)
* 同步鎖是單一JVM內的,對於分佈式系統多個 Tomcat容器多個JVM,Actor模型能更好地“鎖”好資源。

(4) Actor模型
Actor模型內部的狀態由自己的行爲維護,外部線程不能直接調用對象的行爲,必須通過消息才能激發行爲,這樣就保證Actor內部數據只有被自己修改。
一個Actor如何處理多個Actor的請求呢?它先建立一個消息隊列,每次收到消息後,就放入隊列,而它每次也從隊列中取出消息體來處理。通常我們都使得這個過程是循環的。讓Actor可以時刻處理髮送來的消息。

解決“一個人一個坑”的性能瓶頸


參考:
http://www.jdon.com/45728


----- Akka與Reactor比較

兩者皆是異步事件驅動框架,都構建自Actor模型;
Akka用 Scala 編寫的庫,目前更成熟,同時支持Scala和Java API;
Reactor項目始於2012年,由Spring團隊研發,但現在還常常大改。

Akka:
http://akka.io
Java代碼Sample: http://verran.iteye.com/blog/1942393,
http://www.blogbus.com/dreamhead-logs/235916459.html,
http://www.th7.cn/Program/java/2012/03/29/67015.shtml,
https://github.com/XiaoMi/rose/tree/master/rose-example/src/main/java/sample

Sample
HelloWorld.java

public class HelloWorld extends UntypedActor {

    @Override
   public void preStart() {
       final ActorRef greeter =
               getContext().actorOf(Props.create(Greeter.class), "greeter");
       greeter.tell(Greeter.Msg.GREET, getSelf());
   }

    @Override
   public void onReceive(Object msg) {
       if (msg == Greeter.Msg.DONE) {
           getContext().stop(getSelf());
       } else {
           unhandled(msg);
       }
  }
}

Greeter.java

import akka.actor.UntypedActor;

public class Greeter extends UntypedActor {

    public static enum Msg {
       GREET, DONE
   }

    @Override
   public void onReceive(Object msg) {
       if (msg == Msg.GREET) {
           System.out.println("Hello World!");
           getSender().tell(Msg.DONE, getSelf());
       } else {
           unhandled(msg);
       }
   }
}

Reactor:
http://projectreactor.io/old/reference/
https://github.com/reactor/reactor

架構


v.s.
http://stackoverflow.com/questions/16595393/akka-or-reactor


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章