2017-06-18 28 views
2

我有一个在后台每小时下载一个大约100万行的CSV产品文件的演员,然后它将通过CSV循环并改变一个集合。在一个集合中存储100万行,在一个actor中更新

现在在我的播放控制器中,我将向网站访问者显示这100万行的子集。

我会向演员要求给我一份藏品。 如果我在每页请求的基础上这样做,这会是一个性能问题吗?或者正在接近下面的任务?

val futProducts = myActor ? GetProducts 

和我的演员将有该被更新过的每一个小时左右的产品的集合。

var products: List[Product] = ... 

更新

我怎么能建立一个全球参考这个products变量,我可以在我的戏控制器引用,然后还可以在我的演员变异。我认为这将是最好的方法,但不知道如何做到这一点。

+0

很多因素都会影响表演。如果您正在进行多页面请求,您可能需要为每个页面创建'n'个演员。 – erip

回答

1

我不会用全局引用来解决你的products变量,因为这意味着你有一个共享的可变状态。我要和你封装的产品清单中的演员像这样的第一种方式去:您可以在本次测试使用,如图

import DataActor.{Page, Update} 
import akka.actor.Actor 

/** 
    * Created by d058837 on 19.06.17. 
    */ 
class DataActor extends Actor { 

    var data: Seq[Int] = 1 to 100000 
    val pageSize = 100 

    override def receive: Receive = { 
    case Update => 
     updateData() 
    case Page(page) => 
     sender() ! data.slice(pageSize * page, pageSize * page + pageSize) 
    } 

    def updateData() = { 
    data = data.map(_ + 100) 
    } 

} 

object DataActor { 

    case object Update 
    case class Page(page: Int = 0) 
} 

import akka.actor.{ActorSystem, Props} 
import akka.pattern.ask 
import akka.testkit.{ImplicitSender, TestKit} 
import akka.util.Timeout 
import org.scalatest.{Matchers, WordSpecLike} 

import scala.concurrent.Await 
import scala.concurrent.duration.DurationInt 

class DataActorTest extends TestKit(ActorSystem("testSystem")) with WordSpecLike with Matchers with ImplicitSender { 

    "actor with data should" should { 
    "update data and return pages" in { 
     implicit val timeout: Timeout = 3 seconds 

     val dataActor = system.actorOf(Props[DataActor]) 

     val initialStateFuture = dataActor ? DataActor.Page(0) 
     val initialState = Await.result(initialStateFuture, timeout.duration) 
     initialState shouldBe (1 to 100) 

     dataActor ! DataActor.Update 

     val currentStateFuture = dataActor ? DataActor.Page(0) 
     val currentState = Await.result(currentStateFuture, timeout.duration) 
     currentState shouldBe (101 to 200) 
    } 
    } 
} 

,我肯定会用的分页去这样做,这样你就不会随时随地移动你的大量产品列表。

为了获得额外的性能,您可以在您的控制器中使用缓存,当您的DataActor更新其数据时,缓存会失效,因此只有在请求新的/未知的页面时才能击中实际的数据actor。

相关问题