通过某些属性使Akka消息唯一/版本化

时间:2016-08-03 20:50:39

标签: java scala akka actor

我有以下用例:

演员使用来自某些外部源的数据,该外部源由key:value对组成。然后他们将传递给必须在key和最新value上执行某些操作的演员,跳过旧版本。基本上我是在寻求将邮箱分成"子主题"容量为1。 Akka可以这样吗?如果没有,我应该考虑哪些替代方案?

1 个答案:

答案 0 :(得分:0)

我认为您需要的是优先邮箱,其中较新的邮件具有较高的优先级。看一下PriorityMailbox的默认实现。

它可能看起来像这样(基于文档中的示例):

import akka.dispatch.PriorityGenerator
import akka.dispatch.UnboundedStablePriorityMailbox
import com.typesafe.config.Config

type Version = // Long, Date, Timestamp, smth else - must be ordered
case class MyMessage(key: String, value: String, version: Version)

class MyPrioMailbox(settings: ActorSystem.Settings, config: Config)
  extends UnboundedStablePriorityMailbox(
    // Create a new PriorityGenerator, lower prio means more important
    PriorityGenerator {
      case MyMessage(_, _, version) => versionToInt(version)

      // PoisonPill when no other left
      case PoisonPill    => 1 // or  Int.MaxValue - 2

      // We default to 1, which is in between high and low
      case otherwise     => 0 // or Int.MaxValue - 1
    })

此处versionToInt应返回较新版本的邮件(较高优先级)较低的Int值,例如2 - Inf范围内。

之后,您可以跟踪演员中处理的最高版本,并删除早于该版本的所有其他消息。在演员身上使用become或仅使用var

值得一提的是,发送邮件的顺序将由Akka保证,但最终将取决于发件人发出的顺序以及它们之间的延迟,这将影响哪些邮件将被处理