发送给akka Actor的消息有多大?

时间:2018-03-20 10:23:32

标签: scala akka

我是akka的新手,我尝试使用它与Executor框架类似,以异步方式触发某些任务:

override def receive: Receive = {
    case msg: (Int, ListMap[Double,Double], ListMap[Double,Double]) => processHour(msg._1, msg._2, msg._3)
    case msg: String => println("You sent me a String: " + msg)
    case _ => unhandled() 
}

我的问题是:

  1. 如何摆脱编译器警告 "类型模式中的非变量类型参数Int(Int,scala.collection.immutable.ListMap [Double,Double],scala.collection.immutable.ListMap [Double,Double])未选中,因为它是通过擦除消除" 在下面?我会理解ListMap类型的擦除,但编译器似乎抱怨Int ..
  2. 我的消息(有效负载)非常大(每个ListMap都有成千上万的原始数据)。处理包括在地图中显示地图并计算排序距离'两者之间。 是否有一个首选的替代方法是将此作为消息发送以获得更多并行性?我正在考虑将数据存储在演员范围之外......

2 个答案:

答案 0 :(得分:3)

  1. 请勿使用StringInt发送List和元组。使用可以模式匹配的案例类定义适当的协议。

  2. 取决于您对" ok"的定义。您可以尝试调整maximum-frame-size(请参阅例如here),但是您很快就会调整各种心跳超时,因为您的演员会变得越来越没有反应,并且在某些时候您的系统将开始声明系统的其他部分已死亡并相互隔离。使用artery这应该不再是问题。

答案 1 :(得分:2)

此警告在模式匹配中非常常见。编译器警告这些类型仅在编译时存在,因此它不会区分ListMap [Double,Double]和ListMap [A​​ny,Any]。使用TypeTags有一些变通方法。我想给Akka Typed提供一个创造更具表现力的协议的机会。此处详细介绍了如何从经典版本迁移到Typed版本的示例https://www.bbva.com/en/akka-actors-evolution-type-safe-distributed-computations/。为了处理大型数据集,例如我使用Spark。