2017-04-21 1 views
9

私は現在、AkkaとAkka Streamsを広範囲に使用するプロジェクトに取り組んでいます。マテリアライザーインスタンスを共有するか、必要なときに常に新しいインスタンスを作成する必要がありますか?

ストリームを使用するすべての場所で必要となるマテリアライザーのベストプラクティスは何ですか?特にActorSystemにアクセスできる俳優の中にいる場合、手動で既存のマテリアライザーインスタンスを渡すか、必要なときに手動で作成する必要がありますか?

マテリアライザーをオンデマンドでインスタンス化する際に、特にリソースの使用とパフォーマンスが心配です。

答えて

9

ActorMaterializerの作成はかなり安価であり、それらの合理的な増殖は大部分の場合問題ではないはずです。

あなたはActorMaterializer.applyから始まる呼び出しの連鎖を追いかけた場合(source codeを参照してください)あなたはActorMaterializer(以上、ActorMaterializerImpl)は作成時に重要な何かを行っていないことがわかります。

ただ、次のコードは私のラップトップ上の

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") 

出力する。この

システムの作成を検討し、あなたにそれがActorSystem創造と比較する方法のアイデアを与えるために:901ミリ

をマテリアライザー作成:14 ms

しかし、ヨハンがコメントで指摘したように、リソースが漏れないように、マテリアライザーのライフサイクルを適切に管理し、有用でなくなるといつでもshutdownを呼び出す必要があることを追加することが重要です。

可能であれば、いつでもマテリアライザを渡すことをお勧めします。しかし、これは便利ではないときはいつでも、その作成は安いですが、適切にシャットダウンするように注意してください。

+0

私はライフサイクルとライフサイクル管理がパフォーマンスよりも重要だと思います。マテリアライザーを 'シャットダウン 'すると、実行中のすべてのストリームが突然終了します。アクターにマテリアライザーを作成し、アクターを停止するときにシャットダウンしないと、リソースが漏れています。 – johanandren

+0

これにはっきりと同意します。とにかく、2つの選択肢のどちらかでパフォーマンスに大きな歪みはありません。 'mat.shutdown()'は常にあなたの俳優の 'postStop'メソッドに含まれていなければなりません。 –

関連する問題