akka进阶(3) - dispatcher和maibox

3. dispatcher

Actor并不等于thread,经常会多个actor分享一个thread,或者一个actor在不同的thread中被处理。Akka中dispatcher的工作就是把匹配actor和底层的thread,并把消息最高效的发送给这些actor。

这张图很好的解释了dispacher、actor、mailbox和thread之间的关系。 dispatcher metaphor in akka

其实更像这样:

dispatcher in akka

真是发了消息不一定能抢到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。

转载于:https://my.oschina.net/princeicelk/blog/774926

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值