博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高并发分布式事务解决之道-Actor模型(附Akka与Reactor比较)
阅读量:4218 次
发布时间:2019-05-26

本文共 1965 字,大约阅读时间需要 6 分钟。

----- 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

 

 

 

[java]  

  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]  

  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
架构
v.s.
http://stackoverflow.com/questions/16595393/akka-or-reactor

你可能感兴趣的文章
android 消灭星星出错
查看>>
PyCharm 教程(三)Hello world!
查看>>
PyCharm: 显示源码行号
查看>>
cocos2dx使用第三方字库.ttf,需要注意的事项
查看>>
cocos2dx 音频模块分析(4): 音效部分
查看>>
cocos2dx 音频模块分析(5): 音效部分
查看>>
19、Cocos2dx 3.0游戏开发找小三之Action:流动的水没有形状,漂流的风找不到踪迹、、、
查看>>
cocos2.X版本lua端使用定时器的方法
查看>>
lua math.fmod使用注意小数问题
查看>>
lua 时间转化
查看>>
lua学习笔记之五(Lua中的数学库)
查看>>
dos: tree命令生成目录结构
查看>>
Managing Projects from the Command Line(android官网文档)
查看>>
Android项目自动生成build.xml,用Ant打包
查看>>
CCLayer注册lua回调函数setTouchPriority失效
查看>>
cocos2dx左下角三行数值意义
查看>>
LUA modue require package 区别
查看>>
package.loaded
查看>>
cocoStudio: Button设置锚点问题
查看>>
vld 使用
查看>>