Actor模型概念

Actor模型为并行而生,简单说是未解决高并发的一种编程思路。在Actor模型中,主角是Actor,类似一种worker,Actor彼此之间直接发送消息,不需要经过什么中介,消息是异步发送和处理的。在Actor模式中,“一切皆是Actor”,所有逻辑或者模块均别看做Actor,通过不同Actor之间的消息传递实现模块之间的通信和交互。Actor模型描述了一组为了避免并发编程的常见问题的公理:

1.所有Actor状态是Actor本地的,外部无法访问。  
2.Actor必须只有通过消息传递进行通信。  
3.一个Actor可以响应消息:推出新Actor,改变其内部状态,或将消息发送到一个或多个其他参与者。  
4.Actor可能会堵塞自己,但Actor不应该堵塞它运行的线程。

Actor优点、缺点分析

传统的并发编程方式大都使用“锁”的机制,相信大多数都是”悲观锁“,这里几乎可以断定会出现两个明显的问题:

1.随着项目体量增大,业务愈加复杂,不可避免大量使用“锁”,然而大家都知道“锁”的机制其实很耗性能的,所以大量使用锁的机制肯定会造成效率不高

2.即使大量依赖“锁”解决了系统中资源竞争的情况,但是由于没有一个规范的编程模式,最后系统的稳定性肯定会出问题,最根本的原因是没把系统的任务调度抽象出来,由于任务调度和业务逻辑的耦合在一起,很难做一个很高层的抽象,保证任务调度有序。

3.难以维护等等弊端

上面是传统通过“锁”的机制实现并发编程的缺点,然而Actor为什么一定层度上可以解决这些问题呢?个人认为其最根本的原因是Actor模式下提供了一种可靠的任务调度系统,也就是在原生的线程或者协程级别上做了更高层次的封装。这会给编程模式带来巨大的好处:

1.由于抽象了任务调度系统,那么就可以使系统的线程调度可控,易于统一处理,稳定性和可维护性好

2.作为开发者我们只需要关心每个Actor的逻辑就可以了,避免“锁”的“滥用”

3.Actor也提供了很多基本准则,避免了很多并发编程中的问题

……

那么Actor没有缺点吗?那也不是,比如当所有逻辑都跑在Actor中时,很难掌控Actor的粒度,稍有不慎就可能造成系统中Actor个数爆炸的情况,Actor当出现必须共享数据或者状态时就很难避免使用“锁”,但似乎由于上面的“Actor可能会堵塞自己,但Actor不应该堵塞它运行的线程”准则冲突,哈哈,这个时候也许可以选择使用redis做数据共享

Actor技术推荐

Actor技术现在还是蛮成熟的,最著名的原生支持Actor并发模式的Erlang,还有内置Actor核心库的Scala语言。

http://www.cnblogs.com/lixiang-share/p/5829437.html

最新文章

  1. Oracle客户端连接远程Oracle服务中文乱码问题
  2. Zookeeper:通过yarn实现大型分布式管理系统
  3. RABBITMQ(小总结 持续更新...
  4. July 15th, Week 29th Friday, 2016
  5. linux如何查进程、杀进程
  6. 向.net后端发送请求获取数据,在前端动态填充表格
  7. Chipmunk碰撞形状:cpShape
  8. 创建第一个core项目(netCore学习笔记1)
  9. spring kafka生产、消费消息
  10. 外贸站全球网速测试+免费CDN使用教程
  11. FPGA學習筆記(貳)--- 流水燈
  12. c#数据批量插入
  13. windows下查看特定端口被什么程序占用
  14. 11.7luffycity项目(2)
  15. 2.Hibernate的主配置文件hibernate.cfg.xml
  16. 如何在Visual Studio VS中定义多项目模板
  17. IE每次关闭都提示IE已停止工作
  18. opencv-Python---动态人脸捕捉
  19. BZOJ4713 迷失的字符串
  20. 14-n皇后

热门文章

  1. c++ 重载、覆盖 (隐藏)(virtual)
  2. Hibernate里面如何使用DetachedCriteriaCriteria 实现多条件分页查询
  3. Docker初次使用与安装过程
  4. 【CentOS】设置服务开机自动启动
  5. django-全文检索
  6. JS 正则截取字符串
  7. js-数字、字符串、布尔值的转换方式
  8. @Transactional事务不起作用原因
  9. SuperSlide轮播插件滚动高度或宽度不对的问题解决
  10. hibernate动态表名映射