码迷,mamicode.com
首页 > 其他好文 > 详细

Akka咋设计:我猜,我猜,我猜猜猜

时间:2015-04-18 23:27:51      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

假如我要设一个像Akka一样的actor框架,该怎么设计呢?

猜猜看,看有哪些问题需要考虑。


 

  1. 对于actor模型来说,最重要的就是actor
  2. 如果把每个actor构造成一个线程,会简单得多,但是线程的数目必须很少,而actor的数目很多,因此对于一个通用的actor框架,不可能每个actor分配一个线程。所以,actor必须是由别的组件驱动的,有一个不停运转的组件来在actor之间分发消息,也需要有别的组件在另外的线程中处理actor的启动,停止,deathWatch等事件。
  3. 那么,是什么驱动的actor呢?驱动的机制是怎么样的呢?最终的actor的执行环境肯定是一个线程池,那么对于这个线程池的使用,最重要的一点是明确“任务”的切分:怎么样的逻辑才能被做为一个任务提交给线程池呢?
  1. 对于任务粒度,可能包括以下这些选择
    1. 任务的定义为“处理所有actormailbox里的消息,每个actor处理一定数目”。这个定义明显太大了,而且当一个任务在一个线程里执行时,实际是要求这个线程处理很多消息。这样就使得整个actor system的处理速度受限于个别消息的处理速度
    2. 任务的定义为“处理这个actor的这些数目的消息”。这个是挺合理的选择。
    3. 任务的定义为“处理这一个消息”。这个粒度太细,效率会很低。
  2. 接下的问题是,这个驱动器的“驱动间隔”是什么?
    1. 时间驱动:它会隔一定时间检查actor的情况,生成任务。这种情况的问题在于如何避免在“检查这件事”上浪费CPU
    2. 事件驱动:如果有消息发送,它就生成任务。这样的好处在于响应速度可以很快,问题在于如果每个消息都会生成任务,任务粒度就会太细;如果等着消息数目到了一定值再生成任务,那么反应就会变慢。
    3. 结合以上两种。时间和消息数量都会触发任务的生成。
  3. 下一个问题是,这个用于生成任务的驱动器应该是多线程工作的吗?如果是,如何协调多个线程生成任务的动作呢?

至此,可以看看Akka的源码,看它是怎么实现的了。Let‘s do it.

 

Akka咋设计:我猜,我猜,我猜猜猜

标签:

原文地址:http://www.cnblogs.com/devos/p/4438324.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!