Akka Frameworkチュートリアル

Scalaの分散メッセージングプラットフォームAkka Frameworkのチュートリアルをやってみました。Transactional ActorsとJava APIだけでも使い道あるなっていう印象です。

Akka Project
Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors

サイト右に書いてある特長を読んでみると、

Simpler Concurrency
 記述容易なTransactional Actorsによる並列プログラミング
Event-driven Architecture
 ブロックしない非同期イベント駆動アーキテクチャ
True Scalability
 マルチコア、分散マシンでスケールアウト
Fault-tolerance
 Actorノードの階層構造を使った、障害時の自動回復
Transparent Remoting
 プログラムから透過的なリモートActor
Scala & Java API
 スタンドアロンでもAppサーバでも使える。
 いろんなモジュールと統合できるよ。

という特徴をもったフレームワークだそうです。

ウチみたいな小規模SIerがこんなもん調べてどうするっって感じがしますが、後述のサンプルを見てわかるように、ActorとPersistenceがきれいに統合されているので、これだけでも使う価値アリかなと思います。

JavaAPIが用意されている点も結構ミソだと思っていて、
メッセージングシステムを組みたいけどSOA的うんざり系フレームワークは使いたくない!といったときの選択肢の一つとして検証するのも良いと思います。

スケールするかどうかは今のところあまり興味がないですが、流行りなので勉強しておこうかな、くらい。

インストール

Akka本体は不要。まずは、simple-build-tool(sbt)を用意。

任意の空ディレクトリで、

> sbt
Name: TutorialProject
Organization: scalatohoku
Version [1.0]:
Scala version [2.7.7]: 2.8.0.RC3
sbt version [0.7.4]:
Getting Scala 2.7.7 ...
>

※現在リポジトリにある最新jarは「Akka0.9.1+Scala2.8.0.RC3」の組み合わせです。バージョンに注意してください。

次の2つのファイルを作成する。

■project/plugins/Plugins.scala

import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val akkaPlugin = "se.scalablesolutions.akka" % "akka-sbt-plugin" % "0.9.1"
}

■project/build/TutorialProject.scala

import sbt._
class TutorialProject(info: ProjectInfo)
 extends DefaultProject(info)
 with AkkaProject{

  //サンプルでRedis使います。
  val akkaRedis = akkaModule("persistence-redis")

  /* その他、必要に応じてコメントをはずす。
  val akkaAMQP = akkaModule("amqp")
  val akkaCamel = akkaModule("camel")
  val akkaHttp = akkaModule("http")
  val akkaJTA = akkaModule("jta")
  val akkaKernel = akkaModule("kernel")
  val akkaCassandra = akkaModule("persistence-cassandra")
  val akkaMongo = akkaModule("persistence-mongo")
  val akkaRedis = akkaModule("persistence-redis")
  val akkaSpring = akkaModule("spring")
  */
}

sbtプロンプトで環境を整える。

> reload (定義ファイルをリロード)
> update (ライブラリをかき集める)
> console (Scala consoleの起動)
scala>

ここまで用意した環境で、チュートリアルをやってみます。
Akka:Getting Started

前半:軽く動作確認

前述で用意したAkka Project Scala Consoleに、上から順番にコードを貼り付けていきます。

scala> import se.scalablesolutions.akka.actor.Actor
class MyActor extends Actor {
  def receive = {
    case "test" => println("received test")
    case _ =>      println("received unknown message")
  }
}

scala> val myActor = Actor.actorOf[MyActor]

scala> myActor.start

scala> myActor ! "test" // => "received test"

Scala Actorを触ったことがない人が読み進めるのはつらいと思うので、書籍やサンプルなど参照。

後半:サンプルアプリケーション

チャットサンプルの実装方法について説明があります。
Akka:Getting Startedにはimportが抜けていたりバグがあったりしますが、動くソースコードは、
http://github.com/jboner/akka/tree/master/akka-samples/akka-sample-chat/
にあるので(Akka Downloadにも含まれています)、ここでは写経しません。

まずさっさと実行してみます。
ChatServer.scala を、src/main/scala/sample/chat/に置きます。

実行する前にRedisを起動

サンプルでは、persistenceにKey-Valueストア-Redisを利用するので、ダウンロード・インストール・起動する。
自分はCygwinでmakeしましたが問題なく動作しました。

実行

sbt consoleを3つくらい起動します。

1つはチャットサーバとして起動

> sbt compile console
scala> import sample.chat._
scala> import se.scalablesolutions.akka.actor.Actor._
scala> val chatService = actorOf[ChatService].start

残りは、チャットクライアントとして起動。複数consoleで同じことやればチャットできる。

> sbt console
scala> import sample.chat._
scala> val c = new ChatClient("takeda")
scala> c.login
scala> c.post("hello")
scala> c.chatLog
scala> c.logout


とりあえず動いて安心したので、また次のエントリで、

本チュートリアルで学習する範囲:

 Actors
 fault-tolerance using Actor supervision
 remote Actors
 Software Transactional Memory (STM)
 persistence

の内容について、ちゃんと勉強(翻訳?)したいと思います。


同じカテゴリのエントリ
1.Lift再入門 / 8.javascriptからsubmitできない / 7.Ajax Form / 6.Radio、Checkboxについて / 5.行列型の編集FORM / 4.サーバーサイドバリデーションとサーバサイド関数 / 3.ログインFORM - S.param使ったら負け / 2.Snippetメソッドとして許される型 / sbt0.12.xで依存jar抽出タスク / scala2.10+lift2.5+NetBeans7.2 / Scalaで入門関数プログラミング / reactive-webを試してみました / Lift2.2M1のテンプレート機能 / Scala Compiler Plugin / View Bound/Context Bound / ScalaZa01参加してきました / Akka Frameworkチュートリアルの次 / Akka Frameworkチュートリアルその2 / Akka Frameworkチュートリアル / LiftでJCaptcha / Url Rewrite Filter / sbt-android-plugin / Android SDK for Scala / 祝Lift2.0リリース / Liftの携帯対応まとめ / Scala2.8への移行 / Lift 2.0-scala280-SNAPSHOT/sbt0.7.1 / Scalaお絵かき環境 - Kojo / Lift+Quartzでバッチ / Scala&Liftを採用した理由 / Liftでdate_select系ヘルパーを作る / LiftでAjax / LiftのSubmitかしこい / lift-mapperのpaginateを使う / snippetをspecする / Lift Mapperを拡張する / LiftのDBをMySQLに / Liftプロジェクト環境を整える / Scala本読み比べてみました / NetBeans6.7&scala / じつはScalaはライトな言語 / Scalaバザ~ル / lift1.0所感 / specsを読む / implicit def / ScalaならNetBeansがサイコー / scala勉強会@東北がスタート / それでも俺はLiftをやるってのか / Scala&Liftセットアップ / ブログリニューアル /
コメント

コメントしてください

closed.