经常有人问: Akka的Actor和Scala的Actor有什么不同?这里的回答是,从actor 模型角度讲,没什么不同,它们都实现了actor model....Akka actors and Scala actors are two implementations of that model....will only handle a single message at a time messages sent by actor X to actor Y will arrive in the order...thay were sent There is no difference between Scala and Akka actors on this level....具体实现的不同请参考附件 我个人学习Akka的Actor的原因是Spark使用Akka作为消息驱动系统
Actor 系统 Actor 是封装状态和行为的对象,它们通过交换放在收件人邮箱中的消息进行专门的通信。...没有单一的最佳解决方案,但有一些指导方针可能会有所帮助: 如果一个 Actor 管理另一个 Actor 正在做的工作,例如通过传递子任务,那么管理 Actor 应该监督子 Actor。...如果一个 Actor 携带非常重要的数据(即,如果可以避免,其状态不会丢失),则该 Actor 应向其监督的子 Actor 找出任何可能危险的子任务,并处理这些子 Actor 的故障。...如果一个 Actor 依靠另一个 Actor 来履行职责,它应该观察另一个 Actor 的活动(liveness),并在接到终止通知后采取行动。...具有不同配置的多个 Actor 系统可以在同一个 JVM 中共存,没有问题,Akka 本身没有全局共享状态。
在上一篇讨论中我们谈到了监管:在Akka中就是一种直属父子监管树结构,父级Actor负责处理直属子级Actor产生的异常。...[INFO] [05/29/2017 16:11:48.177] [testSystem-akka.actor.default-dispatcher-2] [akka://testSystem/user...selectedChild 上面我们向supervisor发送了一个BackoffSupervisor.GetCurrentChild消息用来获取子级Actor。...] from Actor[akka://testSystem/user/parent#2140150413] to Actor[akka://testSystem/user/parent/supervisor...下面是本次讨论的完整示范代码: package backoffSupervisorDemo import akka.actor._ import akka.pattern._ import scala.util.Random
这些数据使 Actor 有价值,并且必须防止其他 Actor 损坏它们。好消息是,从概念上讲,Akka 的每个 Actor 都有自己的轻量级线程,这完全与系统的其他部分隔离开来。...在幕后,Akka 将在一组真正的线程上运行一组 Actor,在这些线程中,通常许多 Actor 共享一个线程,随后对一个 Actor 的调用可能最终在不同的线程上进行处理。...Akka 确保这个实现细节不会影响处理 Actor 的状态。 因为内部状态对 Actor 的操作至关重要,所以状态不一致是致命的。...Akka 与其他一些 Actor 模型实现不同的一个重要特性是,当前行为必须始终处理下一条出列的消息,没有扫描邮箱以查找下一条匹配的消息。除非重写此行为,否则处理消息失败通常被视为失败。...监督者策略 Actor 的最后一个部分是其处理子 Actor 错误的策略。对于每一个传入故障应用「Supervision and Monitoring」中描述的策略,Akka 将透明地进行故障处理。
: String = "" ,brand: String = "" ) 首先,我们需要这个TxnItem使Read-Actor...** $persistenceId: debug mode = $debug **********") implicit val debugMode = DebugMode(debug) //actor
akka.pattern.ask创建这个 Actor 引用。 DeadLetterActorRef是死信服务的默认实现,Akka 将其目的地关闭或不存在的所有消息路由到该服务。...EmptyLocalActorRef是 Akka 在查找不存在的本地 Actor 路径时返回的:它相当于一个DeadLetterActorRef,但它保留了自己的路径,以便 Akka 可以通过网络发送它...对于如何获取 Actor 引用,有两个通用的类别:通过创建 Actor 或通过查找 Actor,后者的功能包括从具体的 Actor 路径创建 Actor 引用和查询逻辑的 Actor 层次结构。...要获取绑定到特定 Actor 生命周期的ActorRef,你需要向 Actor 发送消息,例如内置标识消息,并使用来自 Actor 的答复的sender()引用。 绝对路径 vs....msg 将向包括当前 Actor 在内的所有兄弟姐妹 Actor 发送msg。对于使用actorSelection获取的引用,将遍历监督层次结构以执行消息发送。
我们在这篇通过一个具体CQRS-Reader-Actor的例子来示范akka-persistence的query端编程和应用。...现在我们可以根据这个例子来示范如何通过CQRS的读端reader-actor读取由writer-actor所写入的操作事件并将二进制格式的事件恢复成数据库表的行数据。...% "logback-classic" % "1.2.3" ) resources/application.conf akka.actor.warn-about-java-serializer-usage...=off akka { loglevel = INFO actor { provider = "cluster" } remote { log-remote-lifecycle-events..., VchItems()) case _ => (state, items) } } Reader.scala package datatech.cloud.pos import akka.actor
akka-typed的actor从创建、启用、状态转换、停用、监视等生命周期管理方式和akka-classic还是有一定的不同之处。这篇我们就介绍一下akka-typed的actor生命周期管理。...akka-typed的守护guardian-actor,即根部root-actor是通过在定义ActorSystem时指定并产生的。...下面这个官方文档上的例子是很好的示范: import akka.actor.typed.Behavior import akka.actor.typed.SpawnProtocol import akka.actor.typed.scaladsl.Behaviors...HelloWorld.Greet("Akka", replyToRef) } ... } 可以看到所有操作都在actor框架之外进行的。...转入停用stop状态可以在另一个作为监视actor的receiveSignal获取,如下: object GreetStarter { import Messages._ def apply
下面是在scala中使用cassandra-java-driver的例子: import com.datastax.driver.core._ import akka.actor.ActorSystem...下面是reader-actor: package datatech.cloud.pos import akka.actor._ import akka.cluster._ import akka.pattern...remote-router是从配置文件定义创建的: akka.actor.deployment { /readerRouter/readerRouter = { # Router type...ackage datatech.cloud.pos import akka.actor._ import datatech.cloud.pos.Messages.PerformRead object.... akka.extensions=["akka.cluster.metrics.ClusterMetricsExtension"] akka.actor.deployment { /readerRouter
但是,akka-cluster-sharding只能支持一种entity actor。毕竟,由于akka-classic的消息是没有类型的,只能在收到消息后再通过类型模式匹配的方式确定应该运行的代码。...抱着一种好奇的心态了解了一下lagom源码,忽然恍然大悟:这个东西是基于akka-typed的!想想看也是:如果我们可以把actor和消息类型绑在一起,那么我们就可以通过消息类型对应到某种actor。...也就是说基于akka-typed,我们可以把综合性的业务划分成多个actor模块,然后我们可以指定那种actor做那些事情。当然,经过了功能细分,actor的设计也简单了许多。...现在这个新的中台可以实现前台应用直接调用对应的actor处理业务了。不用多想了,这注定就是akka应用的将来,还等什么呢? 先从一个最简单的hello程序开始吧:基本上是两个actor相互交换消息。...akka-typed需要用户提供这个顶层actor。这个是在ActorSystem的第一个参数指定的。
Akka是由各种角色和功能的Actor组成的,工作的主要原理是把一项大的计算任务分割成小环节,再按各环节的要求构建相应功能的Actor,然后把各环节的运算托付给相应的Actor去独立完成。...Akka是个工具库(Tools-Library),不是一个软件架构(Software-Framework),我们不需要按照Akka的框架格式去编写程序,而是直接按需要构建Actor去异步运算一项完整的功能...Akka的这些鲜明的特点都是通过消息驱动来实现的。 曾经看到一个关于Actor模式的观点:认为Actor并不适合并发(concurrency)编程,更应该是维护内部状态的运算工具。...1、ActorRef:Akka系统是一个树形层级式的结构,每个节点由一个Actor代表。每一个Actor在结构中都可以用一个路径(ActorPath)来代表它在系统结构里的位置。....scala: import akka.actor._ import akka.dispatch.PriorityGenerator import akka.dispatch.UnboundedPriorityMailbox
-- sbt --> libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.19" 简介 使用 Akka 可以让你从为 Actor...Akka 的 Actor 层级 Akka 的 Actor 总是属于父 Actor。通常,您可以通过调用getContext().actorOf()来创建 Actor。...akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; class PrintMyActorRefActor...你的输出应该与下面的内容相似: First: Actor[akka://testSystem/user/first-actor#1053618476] Second: Actor[akka://testSystem...我们看到了如何创造一个非常简单的 Actor 和其子 Actor。接下来,我们将会把这些知识应该到我们的示例中,获取设备 Actor 的信息。稍后,我们将讨论如何管理小组中的 Actor。
上面的ClusterMonitor是个集群状态监控actor: package sdp.cluster.monitor import akka.actor._ import akka.cluster.ClusterEvent...POSMessage(4021,Subtotal) 下面是服务端分片部署源代码: resources/application.conf akka.actor.warn-about-java-serializer-usage...appender-ref ref="STDOUT" /> ClientDemo.scala package cloud.pos.client import akka.actor...mbr: String = "" ) } client/POSClient.scala package cloud.pos.client import akka.actor...LoggerFactory.getLogger(this.getClass)) } logging/ClusterMonitor.scala package sdp.cluster.monitor import akka.actor
在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式。...虽然Akka同时提供了Java和Scala两种API,但可能由于Akka本身是用Scala开发的,所以感觉用Scala来开发Akka程序会更自然些:笼统来讲,Actor编程主要就是对receive函数的实现...所以,理论上Akka编程初学者应该把主要注意力放在这个receive函数的实现上来,按照一种模版式的方式来编写Akka程序就可以了,如下面演示的这个模版例子: import akka.actor._ object...而这个问题在Akka编程中得到了完美的解决。在Akka编程里我们可以把每段可能产生异常的代码放到一个独立的Actor中去运算。Akka的Actor组织是一个层级结构。...sendSystemMessage(Unwatch(actorRef.asInstanceOf[InternalActorRef], this)) } 被监视对象的终止事件是通过Terminate消息获取的
-- Maven --> com.typesafe.akka akka-actor_2.12 dependencies { compile group: 'com.typesafe.akka', name: 'akka-actor_2.12', version:...-- sbt --> libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.21" 示例项目 你可以查看「FSM 示例项目」...首先,考虑使用以下所有导入语句: import akka.actor.AbstractFSM; import akka.actor.ActorRef; import akka.japi.pf.UnitMatch...任何计时器的状态都可以通过以下方式获取: isTimerActive(name) 这些命名的计时器补充状态超时,因为它们不受接收其他消息的影响。
akka系统是一个分布式的消息驱动系统。akka应用由一群负责不同运算工作的actor组成,每个actor都是被动等待外界的某种消息来驱动自己的作业。...所以,通俗点描述:akka应用就是一群actor相互之间发送消息的系统,每个actor接收到消息后开始自己负责的工作。...对于akka-typed来说,typed-actor只能接收指定类型的消息,所以actor之间的消息交流需要按照消息类型来进行,即需要协议来规范消息交流机制。...典型的单向消息发送fire-and-forget如下: import akka.actor.typed._ import scaladsl._ object Printer { case class...不过,在akka-typed中这种模式最基本的要求就是发送的消息类型必须符合接收方actor的类型。 好了,我们先对这个模式做个示范。所有actor的定义可以先从它的消息类型开始。
-- Maven --> com.typesafe.akka akka-actor_2.11 dependencies { compile group: 'com.typesafe.akka', name: 'akka-actor_2.11', version:...-- sbt --> libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.19" 简介 随着对 Actor 层次结构和行为的理解...package com.example; import akka.actor.AbstractActor; import akka.actor.ActorLogging; import akka.actor.Props...package com.example; import java.io.IOException; import akka.actor.ActorSystem; import akka.actor.ActorRef
Orleans, Proto.Actor, Akka.Net, 和Dapr。我们将重点介绍它们的独特功能和方法。 Orleans Orleans框架是虚拟actor模型的前身。...优点 成熟的开源项目,得到微软的支持 全面的文档 庞大而活跃的社区 支持actor之间的pub-sub流 持久性的提醒--即使行为者已经停用,计时器也能发挥作用 流行数据库的成员表实现,例如社区提供的...缺点 没有明确地支持传统的行为体层次结构 没有可用的商业支持 对于我们的口味来说,"通过属性进行配置 "和其他自动魔法还是有点太多了 Akka.Net Akka.Net是来自Java生态系统的Akka...Proto.Actor Proto.Actor是由Akka.Net的创建者创建的一个框架。它吸收了Akka.Net的经验,但同时也将 "不要重新发明轮子 "作为其主要理念。...如果你已经使用了Dapr,就很方便 持久性的提醒--即使行为者已被停用,计时器也能工作。 缺点 sidecar和应用程序之间的HTTP通信的开销。
通过发送消息,Actor 将工作委托给另一个 Actor。正如我们在「调用栈的假象」中看到的,如果它期望返回值,那么发送 Actor 要么阻塞,要么在同一线程上执行另一个 Actor 的工作。...一个(隐藏的)调度程序实体获取 Actor 并开始执行它。 Actor 从队列前面选择消息。 Actor 修改内部状态,向其他 Actor 发送消息。...Akka 要求所有 Actor 都被组织成一个树形的结构,即一个创造另一个 Actor 的 Actor 成为新 Actor 的父节点。这与操作系统将流程组织到树中的方式非常相似。...这项服务称为监督,是 Akka 的核心概念。 ? 一个监督者(父级节点)可以决定在某些类型的失败时重新启动其子 Actor,或者在其他失败时完全停止它们。...总是有一个负责管理 Actor 的实体:它的父节点。从外部看不到重新启动:协作 Actor 可以在目标 Actor 重新启动时继续发送消息。 现在,让我们简单介绍一下 Akka 提供的功能。
-- Maven --> com.typesafe.akka akka-actor_2.11 dependencies { compile group: 'com.typesafe.akka', name: 'akka-actor_2.11', version:...以下工作对于我们的用例是很有用的: 当查询到达时,组 Actor 将获取现有设备 Actor 的快照(snapshot),并且只向这些 Actor 询问温度。...请记住,当我们启动查询时,我们需要获取当前设备的快照并启动计时器,以便强制执行截止时间。同时,另一个查询可以到达。对于第二个查询,我们需要跟踪完全相同的信息,但与前一个查询隔离。...这需要一个ExecutionContext,它是将执行计时器任务本身的线程池。在我们的示例中,我们通过传入getContext().dispatcher()来使用与 Actor 相同的调度器。
领取专属 10元无门槛券
手把手带您无忧上云