Scala/Akka Actor

index

  • Scala?
  • Akka Actor?
  • Sample

Scala

Scala

  • JVM
  • Better Java
  • 関数型言語

Scala

JVM 上で動作

  • コンパイルすると class ファイルに
  • Java の資産を利用可能
  • ライブラリ

Scala

Better Java

  • Java のように書ける
  • 便利な関数・文法

Scala

関数型言語

  • 「副作用なし」
  • 「第1級関数」

Scala

「副作用なし」

  • val

    val i = 1
    i = 2 // コンパイルエラー!!
    
  • var

    var i = 1
    i = 2 // コンパイル OK
    

Scala

val と var

val = values
var = variables

-> val を推奨

  • 副作用なし

Scala

  • sample

    // Sample1.scala
    object Sample extends App {
    
      println("Hello World!!!")
    
    }
    

    run

    $ scalac Sample1.scala
    $ scala Sample
    

    -> Hello World!!!

Scala

  • スクリプトとしても実行可能

    // Sample2.scala
    println("Hello World!!!")
    

    run

    $ scala Sample2.scala
    

    -> Hello World!!!

Akka Actor

Akka Actor

Akka - http://goo.gl/evYro

フレームワーク

  • 分散処理
  • 非同期処理

Akka Actor

特徴

  • 非同期 - Actor モデル

Akka Actor

  • Actor? Thread?

Akka Actor

Thread

Akka Actor

Thread

  • 共有データ・ロック

    images/mt.png

Akka Actor

Thread

  • 他のスレッドから変更される恐れ
  • 失敗 - デッドロック

Akka Actor

Actor

Akka Actor

Actor モデル

  • メッセージパッシング

    • メッセージ送信
    • メッセージ受信

Akka Actor

Actor

  • メッセージの送受信
  • メッセージのキューイング
  • メッセージ(の型)に応じた処理選択

Akka Actor

Actor

  • メッセージ送信

    images/1.png

Akka Actor

Actor

  • 処理

    images/2.png

Akka Actor

Actor

  • 結果をメッセージとして返却

    images/3.png

Akka Actor

Actor

  • データのやり取りはメッセージ

  • 共有無し

    -> ロックなし

Akka Actor

Actor

  • 必要なもの

    • Actor(s) クラス
    • メッセージクラス

Akka Actor

Actor

  • Actorクラス

    • Main Actor
    • Worker Actor

Akka Actor

Actor?

  • あまり見かけない・・・

Akka Actor

Actor?

  • Thread 採用の言語が多い
  • Java での実装難

-> Scala 標準 Actor

Akka Actor

Scala Akka

  • Actor モデルを標準化

Akka Actor

  • import とメッセージの作成

    import scala.actors.Actor
    import scala.actors.Actor._
    
    // メッセージ用クラス
    case object Msg
    

Akka Actor

  • Actor の宣言

    class SampleActor extends Actor {
      def act() {
        receive {
          // Msg クラス受信時の処理
          case Msg =>
            println("Ping!!")
        }
      }
    }
    

Akka Actor

  • 実行

    object Main extends App {
    
      val sampleActor = new SampleActor
      // Actor 開始
      sampleActor.start
      // メッセージ送信
      sampleActor ! Show
    
    }
    

Akka Actor

Scala Akka

  • シンプル

  • 複雑なことは実装が必要

    • ルーティング
    • バランサー

Akka Actor

-> Akka!!!

Akka Actor

Akka:

Build powerful concurrent &
distributed applications
more easily.

Akka Actor

Akka Actor

  • Java でも Actor モデル実装可能
  • より簡単に記述可能
  • 設定ファイルでの Actor 設定可能
  • ロードバランサー・ルーティング
  • 自己修復
  • remote Actor

Akka Actor

Akka Actor

  • Java

    // Actor 宣言
    public class MasterActor
                 extends UntypedActor {
      @Override
      public void onReceive(Object msg) {
        if (msg instanceof Hoge) {
        .
        .
        .
    

Akka Actor

Akka Actor

  • Java

    // 開始
    ActorRef actor =
        system.actorOf(
            new Props(new UntypedActorFactory() {
                public UntypedActor create() {
                    return new SampleActor();
                }
    }), "actor");
    

Akka Actor

Akka Actor

  • 設定ファイル

    • ログレベル設定
    • ルータータイプ設定
    • Akka 用動作パラメータ変更
    • などなど

Akka Actor

Akka Actor

  • 設定ファイル:

    actor.deployment {
      // 名前設定
      /masterActor/router {
        // ルータータイプ設定
        router = round-robin
        // ルーターに登録する Actor の数
        nr-of-instances = 3
        .
        .

Akka Actor

Akka Actor

  • 設定ファイル:

    actor.deployment {
      /masterActor/router {
        // ルータータイプ設定
        router = smallest-mailbox
        // ルーターに登録する Actor の数を動的に数を変更
        resizer {
          lower-bound = 3
          upper-bound = 10
          .

Akka Actor

Akka Actor

  • Router

    • Routees として Actor を登録
    • Routees にメッセージを割り振る
    • 数種類のタイプ

Akka Actor

Akka Actor

  • Router のタイプ

    • round-robin
    • random
    • smallest-mailbox
    • scatter-gather
    • broadcast

Akka Actor

Akka Actor

  • Router のメッセージ

    • Normal Messages

    • Broadcast Messages

      -> 全ての Routees へ

Akka Actor

Akka Actor

  • Router の作成1

    /sampleActor/router {
      router = round-robin
      nr-of-instances = 3
                 }
    

Akka Actor

Akka Actor

  • Router の作成2

    ActorRef router =
      system.actorOf(
        new Props(ExampleActor.class)
           .withRouter(
              new FromConfig()),
              "router"
           );
    

Akka Actor

Akka Actor

  • Sample

終わりに

  • Scala で簡潔なコードを
  • Akka で見通しの良い並列処理を