# 第12章 ストリーミング
- [副読本](https://doc.akka.io/docs/akka/current/stream/index.html)
- > Stream processing is a different paradigm to the Actor Model or to Future composition, therefore it may take some careful study of this subject until you feel familiar with the tools and techniques (via. 副読本 [How to read these docs](https://doc.akka.io/docs/akka/current/stream/stream-introduction.html))
#### 疑問
#### 感想
## 12.1 基本的なストリーム処理
#### 疑問
#### 感想
### 12.1.2 実行可能なグラフのマテリアライズ
#### 疑問
#### 感想
- > このファイルコピーのサンプルが実行される際、内部では実際に何が行われているのかを見てみましょう。これらの詳細の一部は、Akka内部の非公開部分であるため変更される可能性がありますが、ソースコードをトレースしてすべての動作を確認することは非常に有用です。(p.308)
- 変更されているんだよなぁ...
- deprecated ~~`ActorMaterializer`~~ -> Materializer
- というより、`ActorSystem`がimplicit valueとして存在していれば、`Materializer`を指定しなくて良くなった
- > Simplify running of Akka Streams with an ActorSystem without creating a Materializer (via. [Akka 2.6.0 Released](https://akka.io/blog/news/2019/11/06/akka-2.6.0-released))
- [example](https://doc.akka.io/docs/akka/2.6/stream/stream-quickstart.html#first-steps)
- 本文中に出てくる`FilePublisher`,`FileSubscriber`が`akka-stream:2.6.16`時点では存在しなかったので, 履歴を追いかけた
- [issues#26187 Remove ActorPublisher and ActorSubscriber](https://github.com/akka/akka/issues/26187) で消えた
- `2.6.+`ならとりあえず以下で読み替えれば良さそう
- ~~`FileSubscriber`~~ -> `FileOutputStage` ([pull#27241](https://github.com/akka/akka/pull/27247))
- ~~`FilePublisher`~~ -> `FileSource` ([pull#23626](https://github.com/akka/akka/pull/23626))
- > 前にも述べたように、ソースとシンクはグラフがマテリアライズされたときに補助値を提供します。ファイルのソースとシンクは、完了時に読み込みと書き込みのバイト数を持った`Future[IOResult]`を補助値として提供します。
> RunnableGraphは実行時に1つのマテリアライズされた値を返します。それでは、グラフを通じてマテリアライズされた値に渡される値はどのように決まるのでしょうか? (p.312 『マテリアライズされた値の結合』)
- そもそもマテリアライズされた値 is 何
- > After realizing that RunnableGraph is nothing more than a module with no unused ports (it is an island), it becomes clear that after materialization the only way to communicate with the running stream processing logic is via some side-channel. This side channel is represented as a *materialized value*.
> (via. [Materialized values](https://doc.akka.io/docs/akka/current/stream/stream-composition.html#materialized-values))
- > RunnableGraphが未使用のポートを持たないモジュールに過ぎない(島である)ことを理解した後、実体化した後、実行中のストリーム処理ロジックと通信する唯一の方法は、何らかのサイドチャネルを介して行われることが明らかになりました。このサイドチャネルは、*materialized value*として表されます。
- つまり、対象のstream(の全体)に対する、何らかの観測値であり、streamに流れている値そのものとは異なるなにか、というくらいの理解で良さそう。
- 製油プラントにおける圧力計とか温度計とかの値、みたいな。原油とか石油とかの流体そのものが、streamに流れるもので、それとは異なる計測値
- 横道にそれるが、`it is an island`という表現を見て、ようやくソースコードにあった`IslandTag`という型の意味がわかった...`island`(孤島)なのね
- [akka.stream.impl.IslandTag](https://github.com/akka/akka/blob/26e03f5dd39cf46ece30b666ff6f2385bb89af25/akka-stream/src/main/scala/akka/stream/impl/PhasedFusingActorMaterializer.scala#L632-L635)
## 12.2 ストリーミングHTTP
#### 疑問
#### 感想
- > マーシャリングとアンマーシャリング(P.327)
- シリアライズ/デシリアライズと何が違うんだろう、と思ってたら、そもそもシリアライズ/デシリアライズはJavaで用いられ始めた用語らしいということを初めて知った
- https://togetter.com/li/7028
- 余談だけど、Java の Externalizable ってなんだっけ?
## 12.3 グラフDSLを用いたファンインとファンアウト
#### 疑問
#### 感想
- グラフDSL、「このDSLによって視覚的に実装を把握することができて便利!」というより、「複雑なグラフを文字だけで認識すんのマヂ無理...」という、必要にかられて生まれたもののような気がする(本文の例を眺めながら)
- Domain Specific Language という命名から、そもそもの出発点は視認性とか簡便さというよりも、ひとえに「ドメインの知識・語彙をそのまま使ってプログラミングしたい」的な発想があったのではないかなーと推測(根拠・出典は特に無い……)
- その結果として視覚的に把握できるようになるとか、二次元的なテキスト構造以外の形でも対象を認識できるようになる、的な
- 今回のケースだと、グラフというそもそもの対象が空間的なものなので、それに特化した言語を組み立てると、結果的に視覚的な表現が強くなったという感じなのかなーと(想像)
## 12.4 コンシューマーとプロデューサーの仲介
#### 疑問
#### 感想
## 12.5 グラフの速度の分離
#### 疑問
#### 感想
## 12.6 まとめ
#### 疑問
#### 感想
###### tags: `Akka本読書会`