高并发分布式事务解决之道-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可以时刻处理发送来的消息。

解决“一个人一个坑”的性能瓶颈
高并发分布式事务解决之道-Actor模型(附Akka与Reactor比较)

参考:
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

[java] view plain copy
  1. public class HelloWorld extends UntypedActor {  
  2.   
  3.     @Override  
  4.    public void preStart() {  
  5.        final ActorRef greeter =  
  6.                getContext().actorOf(Props.create(Greeter.class), "greeter");  
  7.        greeter.tell(Greeter.Msg.GREET, getSelf());  
  8.    }  
  9.   
  10.     @Override  
  11.    public void onReceive(Object msg) {  
  12.        if (msg == Greeter.Msg.DONE) {  
  13.            getContext().stop(getSelf());  
  14.        } else {  
  15.            unhandled(msg);  
  16.        }  
  17.   }  
  18. }  

Greeter.java

[java] view plain copy
  1. import akka.actor.UntypedActor;  
  2.   
  3. public class Greeter extends UntypedActor {  
  4.   
  5.     public static enum Msg {  
  6.        GREET, DONE  
  7.    }  
  8.   
  9.     @Override  
  10.    public void onReceive(Object msg) {  
  11.        if (msg == Msg.GREET) {  
  12.            System.out.println("Hello World!");  
  13.            getSender().tell(Msg.DONE, getSelf());  
  14.        } else {  
  15.            unhandled(msg);  
  16.        }  
  17.    }  
  18. }  

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

架构
高并发分布式事务解决之道-Actor模型(附Akka与Reactor比较)
v.s.
http://*.com/questions/16595393/akka-or-reactor