我有以下用例:
演员使用来自某些外部源的数据,该外部源由key:value
对组成。然后他们将传递给必须在key
和最新value
上执行某些操作的演员,跳过旧版本。基本上我是在寻求将邮箱分成"子主题"容量为1。
Akka可以这样吗?如果没有,我应该考虑哪些替代方案?
答案 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保证,但最终将取决于发件人发出的顺序以及它们之间的延迟,这将影响哪些邮件将被处理