2017-06-18 27 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。

相關問題