My Brain is Open.

思いついたことを適当に列列と

akka.io.Tcpのアクター構成について

こちらからの便乗日記です。

日本一わかりやすいというほどでもない Akka2.2 の IO まわりと Pipeline まわり
http://nekogata.hatenablog.com/entry/2013/06/05/222540

akka-actor 2.2からは(元々実験的(experimental)だった) akka.actor.IO が非推奨になったと聞いて、
新生akka.ioの方を調べています。(こちらも現時点ではexperimental)


サーバを構成する場合のアクターはこのような感じです。
https://cacoo.com/diagrams/D09WgiRcVHpFaBOh-00341.png
順に生成手順を追うと、

  1. ServerがIO(Tcp)で得られるTcpManagerにBindを投げて listen するよう指示
  2. TcpManagerはTcpListenerを起動し、TcpListenerはBoundをServerに返す(図ではTcpListenerを端折ってます)
  3. 接続要求があると、TcpListenerはacceptしてTcpConnectionを生成してソケットを渡す
  4. TcpConnectionはServerにConnectedを送る
  5. ServerはServerSessionとPipelineHandlerを生成し、PipelineHandlerの入り口をServerSession、出口をTcpConnectionに設定する。
  6. TcpConnectionにRegisterを送り、ネットワークからのイベント送信先をPipelineHandlerにする。

という感じです。後はServerSessionが外部からEventを受け取ったり、Commandを送信したりしてやり取りするロジックを書くだけ。

もちろん、ServerSessionを立てる立てないとか、その辺は実装次第です。
(一般的には複数のコネクションを処理するために分離すると思いますが)

一方、クライアントの場合も同じようなアクター構成です。
https://cacoo.com/diagrams/D09WgiRcVHpFaBOh-00677.png
違うのはIO(Tcp)へ投げるコマンドがConnectであることで、
TcpConnectorからConnectedが送られてくる以降は基本的に変わらないようです。

ServerSession同様に、ClientSessionを分離するかどうかは実装次第です。
クライアントの場合、そのまま自分自身でプロトコル処理をしても良いでしょう。
https://cacoo.com/diagrams/D09WgiRcVHpFaBOh-627E2.png

後ほどコード例とかパイプラインについて紹介しようと思います。