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

snailjob连接服务端报错2025-05-28 10:12:59 [snail-job-grpc-client-executor-127.0.0.1-1] ERROR c.a.s.c.c.handler.ClientRegister - heartbeat check requestId:[0] message:[INTERNAL: http2 exception]客户端报错2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.netty-receive-request-dispatcher-14] ERROR c.a.s.s.c.r.s.RequestHandlerActor - http request error. [] com.aizuda.snailjob.server.common.exception.SnailJobServerException: Token authentication failed. [namespace:null groupName:null token:null] at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.doProcess(RequestHandlerActor.java:84) at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.lambda$createReceive$0(RequestHandlerActor.java:63) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20) at scala.PartialFunction.applyOrElse(PartialFunction.scala:214) at scala.PartialFunction.applyOrElse$(PartialFunction.scala:213) at akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:269) at akka.actor.Actor.aroundReceive(Actor.scala:537) at akka.actor.Actor.aroundReceive$(Actor.scala:535) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579) at akka.actor.ActorCell.invoke(ActorCell.scala:547) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270) at akka.dispatch.Mailbox.run(Mailbox.scala:231) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) 2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.default-dispatcher-10] ERROR akka.actor.OneForOneStrategy - Json转对象失败 参数: com.aizuda.snailjob.common.core.exception.SnailJobCommonException: Json转对象失败 参数: at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:285) at com.aizuda.snailjob.common.core.util.JsonUtil.parseObject(JsonUtil.java:53) at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.lambda$createReceive$0(RequestHandlerActor.java:66) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20) at scala.PartialFunction.applyOrElse(PartialFunction.scala:214) at scala.PartialFunction.applyOrElse$(PartialFunction.scala:213) at akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:269) at akka.actor.Actor.aroundReceive(Actor.scala:537) at akka.actor.Actor.aroundReceive$(Actor.scala:535) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579) at akka.actor.ActorCell.invoke(ActorCell.scala:547) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270) at akka.dispatch.Mailbox.run(Mailbox.scala:231) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:5008) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4910) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3860) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3828) at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:283) ... 18 common frames omitted 2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.default-dispatcher-10] INFO akka.actor.RepointableActorRef - Message [akka.dispatch.sysmsg.Recreate] from Actor[akka://NETTY_ACTOR_SYSTEM/user/$e#607696578] to Actor[akka://NETTY_ACTOR_SYSTEM/user/$e#607696578] was not delivered. [5] dead letters encountered. If this is not an expected behavior then Actor[akka://NETTY_ACTOR_SYSTEM/user/$e#607696578] may have terminated unexpectedly. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.default-dispatcher-10] ERROR akka.actor.OneForOneStrategy - Json转对象失败 参数: com.aizuda.snailjob.common.core.exception.SnailJobCommonException: Json转对象失败 参数: at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:285) at com.aizuda.snailjob.common.core.util.JsonUtil.parseObject(JsonUtil.java:53) at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.lambda$createReceive$0(RequestHandlerActor.java:66) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20) at scala.PartialFunction.applyOrElse(PartialFunction.scala:214) at scala.PartialFunction.applyOrElse$(PartialFunction.scala:213) at akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:269) at akka.actor.Actor.aroundReceive(Actor.scala:537) at akka.actor.Actor.aroundReceive$(Actor.scala:535) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579) at akka.actor.ActorCell.invoke(ActorCell.scala:547) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270) at akka.dispatch.Mailbox.run(Mailbox.scala:231) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:5008) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4910) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3860) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3828) at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:283) ... 18 common frames omitted
最新发布
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值