3. dispatcher
Actor并不等于thread,经常会多个actor分享一个thread,或者一个actor在不同的thread中被处理。Akka中dispatcher的工作就是把匹配actor和底层的thread,并把消息最高效的发送给这些actor。
这张图很好的解释了dispacher、actor、mailbox和thread之间的关系。
其实更像这样:
真是发了消息不一定能抢到Actor,分到actor不一定能抢到thread,抢到thread不一定能抢到CPU,都不容易啊!
Dispatcher有这些类型:
-
Dispatcher(默认) 默认的Dispatcher在对非阻塞的代码优化的。
-
PinnedDispatcher Pinned会给每个Actor分配一个仅有一个线程的线程池(所以只能用thread-pool的executor),pinned__对阻塞的代码是优化的__,比如I/O和数据库操作。
-
BalancingDispatcher Actor之间是共用一个Mailbox的。
-
CallingThreadDispatcher 测试用。
前面提到了executor, 其实具体executor是如何在幕后执行的我还不熟悉。我记得看到过文档说默认的fork-thread是在大部分情况下最优的,所以如果不是为了控制thread数量就不要改成thread-pool了吧。
##4. mailbox akka中提供的mailbox类型非常多,我们弄清楚几个概念就能理解不同mailbox的功能:
-
Bounded/Unbounded,是否有最大消息数的限制;
mailbox-capacity
最大消息数mailbox-push-timeout-time
超时限制- bounded的mailbox都在设制一个非0的mailbox-push-timeout-time会超时而导致阻塞,将timeout-out设置为0则会抛弃新来的消息;
- 有个特殊的NonBlockingBoundedMailbox,进不来的消息会被丢弃到Deadletter里。
-
Priority, 允许消息的优先级
-
Stable, 承诺先进先出
比如说,UnboundedPriorityMailbox是一个没有消息限制、可推送带优先级的消息、保证高优先级先出列、但不保证同优先级一定先进先出的mailbox。