Akka on Raspberry Pi

by nobkz

 @nobkz

  • はなだ のぶかず
  • 福岡在住
  • 株式会社Groovenauts Rockstar Engineer
  • TECH PARKというテクノロジー教育のアフタースクールで働いている
  • Technical RockstarsでCTOやってた。
  • Scala/Erlang/Rust/Lisp(Shen, Clojure, Common Lisp, Racket)
  • 現在グラフィカル言語つくっている。
  • ボードゲーマ
  • 九州大学芸術工学部音響設計学科出身

TECH PARK

ボードゲーム

こんなかんじのことを言う

  • Raspberry Piとは? Akkaとは?
    • AkkaとErlangとアクターモデル
  • なぜに、Raspberry Pi + Akka + Scala?
  • Akka persistenceとAkka remote
  • 細かい設定ファイルだとか
  • Scalaは楽しいよ

Raspberry Piとは?

Raspberry Piとは?

  • ちっさいコンピュータ
  • プログラム教育に向いてる。
  • でも、電子工作もたのしい
  • Raspberry Piでプロトタイプや作品が作られていることもある
    • 入退室管理プロトタイプ
    • Avator (作品)

Avator

Akkaとは?

akkaとは?

  • 並列、分散処理のためのツールキット
  • アクターモデル
  • 沢山の機能があるよ!

アクターモデルとは?

  • 並行処理の2つのモデル
    • shared memory communication
    • message passing  communication
  • よくあるJavaのマルチスレッドとかは前者
  • Message passing Communicationの代表例
    • アクターモデル
    • goのchannelなど

アクターモデル

  • 軽量プロセス
  • 非同期メッセージパッシング
  • メールボックス

アクターの利点、欠点(主観)

  • テキトーに実装しても動く
  • メッセージ投げ合う設計がめんどい

Erlangとの違い

  • 言語が違う
    • 動的型 vs 静的型
    • ホットコードローディングの有無
    • Erlang VM  vs JVM
  • アクターの状態の持ち型が違う
    • erlang : 引数で回す
    • akka :  オブジェクトが内部変数を持つ

なぜRaspberry Pi  + Akka + Scalaなのか?

あとなにつくったん?

なんでそんなの使うん?

  • Scalaがたのしい
  • Akkaがたのしい
  • Raspberry Pi がたのしい

Akka on Raspberry Pi 

背景

  • TECH PARKでは、子供の入退室時に保護者にメールを送る
  • すんごくたいへんだから、つくろう

つくったのもの

  • 入退室管理&入退室メール配信システム
  • 入室時、生徒の会員をQRで読みこむ
    • いずれ、顔認証させるぜ!!!
  • メール配信は、Gmail APIでやる
  • ついでに、動画を管理アプリで配信もする

Raspberry Pi

3 Model B

Web
Camera

Speaker

USB

ステレオ

GPIO

ボタン

LED 

+

超音波センサー

Raspberry Pi

3 Model B

Raspberry Pi

3 Model B

Raspberry Pi

3 Model B

OSX

会員管理

カメラ確認

QRコード印刷

入退室管理

QRコードリーダ

入退室管理

QRコードリーダ

入退室管理

QRコードリーダ

無線lan

無線lan

無線lan

無線lan

設計と実装

環境

  • Scala 2.12.2
  • akka 2.5.4
  • Raspberry PI 3 MODEL B

Raspiの環境構築

  • Raspbianを使用
  • javaのみセットアップ
  • osxでscala/rustでビルドして生成したjarを送る。

Akka Remote

  • 他のRasPiや、OSXのアプリを協調させるために、Akka Remoteをつかう
  • コードをあんまり変更せずに他のマシンに送る
  • カメラの画像もAkka Remoteで送る

Application.conf

akka {
  actor {
    provider = remote
  }
  remote {
    maximum-payload-bytes = 30000000 bytes
    artery {
      enabled = on
      canonical.hostname = "127.0.0.1"
      canonical.port = 23320
      maximum-large-frame-size = 4MiB
      message-frame-size =  30000000b
      send-buffer-size =  30000000b
      receive-buffer-size =  30000000b
      maximum-frame-size = 30000000b
  ...

画像を送る

  • そのままではサイズがでかい
    • 画像圧縮
  • また、送信の頻度が高すぎる
    • ループの間隔を調整

入退室の履歴管理

  • 会員事に入退室の履歴管理をする。
  • データの永続化が必要
  • Akka Persistence

Akka Persistence

  • Actorの内部状態を永続化
  • その状態に至るまでのメッセージ(イベント)を記録する
  • 復旧したときにイベントを再現する

Akka Persistence : 状態を記録する

    case UpdateStudent(number, nickName, name, emailAddress) =>
      val newStudent = Student(number, nickName, name, emailAddress)

      persist(UpdateStudentEvent(newStudent)) { 
            ....
      }

Akka Persistence : 状態を復元する。

  val receiveRecover: Receive = {
    case UpdateStudentEvent(student) =>
      studentsTable =
        studentsTable.updateStudent(student)
 ...

Application.conf

akka.persistence.journal.plugin = "akka.persistence.journal.leveldb"
akka.persistence.snapshot-store.plugin = "akka.persistence.snapshot-store.local"

// 永続化用ファイルの置き場所
akka.persistence.journal.leveldb.dir = "target/example/journal"
akka.persistence.snapshot-store.local.dir = "target/example/snapshots"

Raspberry Piにおける問題点

  • Akka Persistenceは journalの実装にLevel DBをデフォルトで利用している。
  • しかし、ARMバージョンのLevel DB JNIが無い。
  • なので、Level DBではなく、他のDBを利用する。
  • Mongo DBで解決した。

Mongo DBでAkka Persistence のプラグイン実装

たぶん、時間がないので省略

使用したライブラリなど

  • GPIO周り ー> Pi4J
  • QRコードの認識部分 -> Rustで自分で実装
  • Web Camera -> webcam-caputure
  • リングハッシュ ー> 自分で実装

まとめ

Raspberry Pi + Akkaで身近な問題を解決できる。

  • IoTとはいいたくない。
  • ほんとうに身近なこと
  • 楽しいです。
  • Akka たのしい
  • Scala たのしい