2017-04-21 48 views
9

我目前正在研究一個廣泛使用Akka和Akka Streams的項目。我應該共享Materializer實例還是在需要時始終創建一個新實例?

使用它時會遇到一個問題/問題:在所有使用流的地方,Materializer的最佳實踐是什麼?特別是當我在Actor中時,只能訪問ActorSystem,我應該手動傳遞一個現有的Materializer實例,還是隻在需要時創建一個實例?

我特別擔心按需實例化Materializers時的資源使用情況和性能。

回答

9

創建ActorMaterializer s相當便宜,在大多數情況下,它們的合理擴散不應該成爲問題。

如果你追從ActorMaterializer.apply開始的調用鏈(見source code),你會發現,ActorMaterializer(或更好,ActorMaterializerImpl)不執行任何操作在創建時顯著。

只給你如何比較的ActorSystem創作的想法,考慮下面的代碼

val sysStart = System.nanoTime() 
    val actorSystem = ActorSystem("mySystem") 
    val sysDuration = FiniteDuration(System.nanoTime() - sysStart, TimeUnit.NANOSECONDS) 
    println(s"System creation: ${sysDuration.toMillis} ms") 

    val matStart = System.nanoTime() 
    val materializer = ActorMaterializer()(actorSystem) 
    val matDuration = FiniteDuration(System.nanoTime() - matStart, TimeUnit.NANOSECONDS) 
    println(s"Materializer creation: ${matDuration.toMillis} ms") 

輸出這對我的筆記本電腦

制度創新:901毫秒

物化器創建:14 ms

然而,正如約翰在評論中指出的那樣,重要的是要補充物化器的生命週期需要得到妥善管理,只要他們停止使用,就調用shutdown以避免資源泄漏。

回顧一下,儘可能傳遞物化器是一個很好的選擇。不過,如果這不方便,它的創造便宜,但要注意正確關閉它。

+0

我認爲生命週期和生命週期管理比性能更重要。如果你關閉一個實現器,它的所有正在運行的流都會突然終止,如果你在一個actor中創建一個實現器,並且當你停止這個actor時你不關閉它,那麼你正在泄漏資源。 – johanandren

+0

絕對同意這一點,無論如何,表現並不是與2種選擇中的任何一種大規模傾斜。 'mat.shutdown()'應該總是包含在你的actor的'postStop'方法中。 –

相關問題