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