zoukankan      html  css  js  c++  java
  • Actor模式初步入门

    从实习到现在,一直在做Unity相关的业务,不知不觉中感觉已经不在关注服务器相关的技术了。一次偶然的机会再腾讯的gad平台上观看了云风在15年在腾讯做的skynet讲座(http://gad.qq.com/content/coursedetail/467),skynet是用c写的核心,lua做上层业务,基于actor模型的服务器框架,哈哈,这次学习actor模式的学习也是因此而起。

    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语言。

    摘录一下某网站的一段关于Scala的Actor模式代码:

    复制代码
    class Pong extends Actor {
      def act() {
        var pongCount = 0
        while (true) {
          receive {
            case Ping =>
              if (pongCount % 1000 == 0)
                Console.println("Pong: ping " + pongCount)
              sender ! Pong
              pongCount = pongCount + 1
            case Stop =>
              Console.println("Pong: stop")
              exit()
          }
        }
      }
    }
    复制代码

    有些语言如java,C#并没有原生对Actor模式的支持,但是有很多的开源库弥补了这个缺失。如著名的Akka就提供了对java Actor模式的支持,Akka非常庞大,准确说它不仅是对Actor模式的支持,更是提供了基于Actor编程框架,学习成本其实还蛮高的。推荐一个轻量级基于java的Actor库μJavaActors,它仅仅只有1200行左右的代码,实现了Actor核心,初学者可以把代码读一遍,基本上Actor模式就有个入门了。最后还有一个基于C#的Actor开源项目Orleans,据说被不少大型项目采用。

    最后

         μJavaActors简单对Actor有个初步理解,后面会记录一下关于Akka和μJavaActors项目的Demo、源码简单分析,最后会用C#简单实现一个Actor库。下面附上文中提到的技术点的链接:

    Orleans:https://github.com/dotnet/orleans

    Akka:https://github.com/akka/akka

    μJavaActors:http://www.ibm.com/developerworks/cn/java/j-javaactors/

    Actor入门:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html

  • 相关阅读:
    21.Merge Two Sorted Lists 、23. Merge k Sorted Lists
    34. Find First and Last Position of Element in Sorted Array
    leetcode 20. Valid Parentheses 、32. Longest Valid Parentheses 、301. Remove Invalid Parentheses
    31. Next Permutation
    17. Letter Combinations of a Phone Number
    android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
    oc 异常处理
    oc 类型判断
    oc Delegate
    oc 协议
  • 原文地址:https://www.cnblogs.com/jaderoy/p/6689837.html
Copyright © 2011-2022 走看看