akka [已关闭]

monwx1rj  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(132)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.

两年前就关门了。
Improve this question
现在我正在学习 akka 。但是我发现 akka 有两个版本:经典的和类型化的。它和我应该学习的有什么区别?
类型化版本是否有更强的类型控制?如果有,为什么只在2.6版本中引入?
谢谢你的回答。

z0qdvdin

z0qdvdin1#

“经典”参与者是无类型的。您定义一个接受Any对象的参与者,并使用模式匹配来定义它将实际处理哪些消息。

// from https://doc.akka.io/docs/akka/current/actors.html
class MyActor extends Actor {
  val log = Logging(context.system, this)

  def receive = {
    case "test" => log.info("received test")
    case _      => log.info("received unknown message")
  }
}

必须为每个参与者定义的receivePartialFunction[Any, Unit]。它不能防止您将消息发送给错误的参与者-一个会自动忽略它的参与者。它不能防止您发送错误类型的消息。您可以将所有消息发送给每个人。
从某种Angular 来看,您有一个并发模型-构建在强类型语言之上-它与JavaScript一样是强类型的。
Akka Typed所做的是让你通过类型化的 Package 器发送消息,而不使用类型化的参与者:

// from https://doc.akka.io/docs/akka/current/typed/actors.html#akka-actors
object HelloWorld {
  final case class Greet(whom: String, replyTo: ActorRef[Greeted])
  final case class Greeted(whom: String, from: ActorRef[Greet])

  def apply(): Behavior[Greet] = Behaviors.receive { (context, message) =>
    context.log.info("Hello {}!", message.whom)
    message.replyTo ! Greeted(message.whom, context.self)
    Behaviors.same
  }
}

object HelloWorldBot {

  def apply(max: Int): Behavior[HelloWorld.Greeted] = {
    bot(0, max)
  }

  private def bot(greetingCounter: Int, max: Int): Behavior[HelloWorld.Greeted] =
    Behaviors.receive { (context, message) =>
      val n = greetingCounter + 1
      context.log.info2("Greeting {} for {}", n, message.whom)
      if (n == max) {
        Behaviors.stopped
      } else {
        message.from ! HelloWorld.Greet(message.whom, context.self)
        bot(n, max)
      }
    }
}

这样您就可以:

  • 类型化的参与者(Behavior),它告诉您它们接受哪种类型的消息
  • 我键入了ActorRef,这将帮助您只向参与者发送正确类型的消息
  • 类型化的ActorSystem,它定义了可以直接发送到参与者系统的消息类型。

它是“最近”才提出的,但有关它的工作持续了几年,它只是最近的代码达到了它的创造者的预期成熟度。模块existed in repo for at least 2 years,但从我的记忆中,它的工作已经持续了一段时间。第一个问题标记为有关Akka类型是从May 2017,但工作的任何“类型演员”最早可以追溯到May 2014(这意味着作者们已经讨论了一段时间,尽管这些earlier concepts与我们今天所拥有的略有不同)。
长话短说就是(对大多数人来说,大部分时间,YMMV)更好,但需要时间才能做对,如果你想在格林菲尔德项目中使用它们(由于某种原因必须使用演员)那么我会建议Typed。如果你必须在现有的项目中与演员一起工作,那么几乎可以肯定他们会使用经典,所以如果你想靠 akka 谋生的话你就得知道这两点。

相关问题