关联Akka中的消息

时间:2018-05-25 03:19:16

标签: akka

我正在学习阿卡。假设我们有几个学生演员用英语提问,有几个教师演员用葡萄牙语回答,只有一个翻译演员,如下图所示。

enter image description here

如何将问题与答案相关联?

  • 我应该将相关列表作为译者演员的状态吗?
  • 我应该将学生演员的完整路径添加为消息有效负载中的字段,因此译员演员可以找到提出问题的学生(使用 actorSelection ActorSystem的方法)?
  • Akka是否有一些内置功能可以自动跟踪“调用堆栈”?
  • 其他方式?

PS。在这个例子中,只有三种类型的演员,但我们也要考虑我们之间可以有很多其他演员。

2 个答案:

答案 0 :(得分:1)

我建议你采用不同的方法。学生和老师都直接相互沟通。如果他们不懂语言,他们可以使用翻译服务来获取正确的语言信息。这样,学生和老师不需要知道使用另一种语言的语言,并使通信协议更加简单。

答案 1 :(得分:1)

以下是可能解决您问题的几个要点(不一定与您的问题的顺序相同):

  • 如果您想查找学生提出的问题,请将学生演员的MapactorRef(*)维持为私人actorPath密钥和相应的问题ID(例如,使用随机UUID分配)作为值。由于Map在密钥查找中是高效的(O(1)),因此如果还需要按问题查找,则甚至可以维持另一个Map反转密钥和值的情况并不罕见。 / p>

  • 为了实现可扩展性,我会通过删除例如已经发送给教师的问题来保持Map最小化。如有必要,可以将处理过的问题保存在数据库(例如Redis,Cassandra)中以进行分析查询。

  • 发送给译者演员的问题将根据他们的语言/主题进行模式匹配,以便派遣到匹配的教师角色。例如,根据业务需求,可以通过Akka router将问题循环到一组符合条件的教师角色。

  • 如果需要进行额外的答案处理工作,答案可以直接从教师发送给学生,也可以通过中间人(可能是演员翻译)发送。

  • Akka将消息发送给mailbox中的演员并允许操作自定义。为了维护Q& A的详细帐户,我建议您应用自己的编程逻辑,并在必要时将它们存储在数据库中。

(*)归结为在actorRefactorPath之间进行选择时的具体业务要求。主要区别在于是否可能发生演员转世。例如,如果您想要将使用相同actorPath已终止学生演员的新学生演员视为单独的学生,请使用actorRef。有关详细信息,请参阅此Akka doc