SlideShare ist ein Scribd-Unternehmen logo
1 von 70
Downloaden Sie, um offline zu lesen
Actor とエラーハンドリング
    ∼Erlang 時々 Scala∼


            M.Ikuta(@cooldaemon)
                      Sep.4,2011




                                   1
自己紹介

決済代行会社のプログラマ

 某大手クーポンサイトの決済システム

 iPhone + ScanJacket 

Erlang 基礎勉強会や分散処理勉強会の主催




                          2
モチベーション
何故、エラーハンドリングの知識が必要か?

堅牢なシステムを構築したい

休日に家族サービスができる




                       3
モチベーション
何故、エラーハンドリングの知識が必要か?

堅牢なシステムを構築したい

休日に家族サービスができる


3DS の稟議が通る


                       3
モチベーション


並行や分散を取り入れるとシステムが複雑に?

並行や分散だからこそ堅牢なシステムを作れる!




                         4
本日のお題
Erlang と Scala の紹介

Actor モデル

リンクによる相互監視

Supervisor Tree 

Error Logger 

例外


                     5
本日のお題
Erlang と Scala の紹介

Actor モデル

リンクによる相互監視

Supervisor Tree 

Error Logger 

例外


                     6
Erlang と Scala の紹介

 何故、Actor モデルの話をするために Erlang
 と Scala を選んだのか?

  私が他の Actor モデルを実装したライブラ
  リや言語を知らない

  本日、話す予定のリンクによる相互監視が、
  他の Actor 実装に採用されているか不明



                               7
Erlang と Scala の紹介
 Erlang 

  ネットワークサーバを作るための DSL

  並行と分散が得意

  高い耐障害性

  稼働率 99.9999999% も夢ではない




                           8
Erlang と Scala の紹介
 Erlang 

  Yaws, Mochiweb, RabbitMQ, CouchDB,
  Hibari, Riak, Kai, Scalaris,
  Ejabberd, etc..
  Tsung や BashoBench のような負荷試験
  ツールも作りやすい

  モジュールや関数を物理的に離れたノードに転
  送できるので MapReduce なども得意


                                       9
Erlang と Scala の紹介
 Scala 

  様々な言語の長所を集めた次世代言語

  夢と希望が詰ってる

  並行処理に関連するキーワードだけでも…

    Thread, Actor, 部分継続, 並列コレク
    ション, 非同期IO, CAS, STM, etc..



                                  10
Erlang と Scala の紹介
 Scala 

  選択肢が多く、組み合わせも自由

    Actor + STM 

    Actor + 継続

    Actor + 非同期IO

    継続 + 非同期IO


                     11
本日のお題
Erlang と Scala の紹介

Actor モデル

リンクによる相互監視

Supervisor Tree 

Error Logger 

例外


                     12
Actor モデル




            13
Actor モデル
並行に動作する計算実体




               13
Actor モデル
並行に動作する計算実体

 もう少し詳しい話をこれからするので、知って
 る人は寝てて OK




                         13
Actor モデル
世の中の全ては Actor である

全ての Actor は並行に動作する

Actor は、個々にローカルメモリを持ち、
Actor 間でメモリ共有を行わない

Actor は、自分自身や他の Actor とメッセー
ジを送受信しながら処理を行う




                              14
Actor モデル
Actor は、メッセージを受信するためにメール
アドレスとメールボックスを持つ

メッセージは、メールアドレス宛に送信される

メッセージは、メールボックスに格納される

メッセージは必ず届いて処理される




                           15
Actor モデル
メッセージの送信は非同期に行われる

メッセージ受信の順番は保証されていない

メールボックスから任意のメッセージを取り出せる

Actor は、新たな Actor を作成できる




                           16
Actor モデル
Erlang と Scala には実装されていないが…

 Actor はノードを越えて移動できる

   暇なノードへ働きに行ったり

   壊れたノードから逃げたり




                              17
Actor モデル

    Mailbox           Actor                       Mailbox           Actor
                                              message   message   receive
                    Receive   Send
Message   Message




                                     Create        Mailbox           Actor



                                                                             18
本日のお題
Erlang と Scala の紹介

Actor モデル

リンクによる相互監視

Supervisor Tree 

Error Logger 

例外


                     19
リンクのよる相互監視
リンク

 二つの Actor 間のエラー伝播経路を定義

 二つの Actor がリンクされている場合、一方
 の Actor が停止すると、もう一方に EXIT シ
 グナルが送られる




                               20
リンクのよる相互監視
EXIT シグナル

 Actor が停止する際に自動的に生成される(故
 意に生成する事もできる)

 停止する Actor とリンクしている全ての
 Actor へブロードキャストされる

 EXIT シグナルには停止理由が含まれる




                            21
リンクのよる相互監視

   A   Link   B




   A          B



       EXIT
   A          B




   A




                  22
リンクのよる相互監視

           B          C
A



               EXIT
    EXIT
           B          C
A




                      C
A




                          23
リンクのよる相互監視

                B          C
 A



                    EXIT
                B          C
 A




         EXIT
 A              B




     A




                               24
リンクのよる相互監視
EXIT シグナル

 EXIT シグナルを受信した Actor は、
 trap_exit が true か否かで動作が異なる

 Erlang では、trap_exit が true の
 Actor をシステムプロセスと呼ぶ




                                25
リンクのよる相互監視
  システムプロセス(Erlang)

trap_exit 停止理由               動作

  TRUE   kill    停止:killed をブロードキャスト

  TRUE     X     {'EXIT', Pid, X} をメールボックスに追加


 FALSE   normal 無視

 FALSE   kill    停止:killed をブロードキャスト

 FALSE     X     停止:X をブロードキャスト

                                                26
リンクのよる相互監視
  システムプロセス(Scala)

trap_exit 停止理由               動作


  TRUE     X     Exit(Actor, X) をメールボックスに追加



 FALSE   'normal 無視


 FALSE     X     停止:X をブロードキャスト


                                              27
リンクのよる相互監視
リンクの利点

 故障箇所を Actor (やノード)に隔離できる

  大怪我ではなく、擦り傷で済む

 依存関係がある Actor をまとめて停止できる

 一方がシステムプロセスであれば、停止を検知
 してエラー処理を行える



                            28
リンクのよる相互監視
リンクの利点

 リンクはノードを越えて行える

  監視 Actor と Worker Actor を、それ
  ぞれ、物理的に離れた別ノードに配置できる

  障害が発生した信頼できない Actor(やノー
  ド)にエラー処理を任せない




                                 29
リンクのよる相互監視
エラー処理は…

 監視している Actor が処理を引き継ぐ

 停止した Actor を再起動

 処理を引き継ぐ Actor を別ノードに作る

 社内監視システムにエラー通知を行う

 etc…


                          30
リンクのよる相互監視
リンクの利点

 コードがスッキリする




              31
リンクのよる相互監視
 JavaScript

if (is_success()) {
  do_samething();
} else {
  throw "Exception";
}




                       32
リンクのよる相互監視
 Erlang

ok = is_success(),
do_samething().



ok 以外で例外 {badmatch, 戻り値} が発生




                               33
リンクのよる相互監視
 JavaScript

var num = get_number();
switch (num) {
  case 1:
    do_samething1();
    break;
  case 2:
    do_samething2();
    break;
  default:
    throw "Exception: " + num;
    break;
}

                                 34
リンクのよる相互監視
  Erlang

 case get_numer() of
   1 -> do_samething1();
   2 -> do_samething2()
 end.


1, 2 以外で例外 {case_clause, 戻り値} が発生




                                    35
リンクのよる相互監視
  Erlang

 do_samething(get_number()).
 do_samething(1) -> do_samething1();
 do_samething(2) -> do_samething2().



1, 2 以外で例外 {function_clause, 戻り値} が発生




                                        36
リンクのよる相互監視
 Scala

getNumber() match {
  case 1 => doSamething1()
  case 2 => doSamething2()
}


例外 scala.MatchError が発生するが、Actor
内ならリンク先に Exit(Actor, Exception)



                                   37
リンクのよる相互監視
リンクの利点

 コードがスッキリする

  異常事態を考慮したコードを書く必要がない

  その場でウダウダせずに、システム全体の構
  造により頑健性を担保する




                         38
リンクのよる相互監視
リンクの利点

 コードがスッキリする

  とは言え…回復不能な想定外の異常事態が発
  生した場合の処理のみ省略する事!!




                         39
本日のお題
Erlang と Scala の紹介

Actor モデル

リンクによる相互監視

Supervisor Tree 

Error Logger 

例外


                     40
Supervisor Tree
Actor リンクを木状に構成したもの

木の上位にある Actor(trap_exit=true)が下
位の Actor を監視する

監視専用の Actor を Supervisor と呼ぶ

 Erlang OTP
 Akka



                                  41
Supervisor Tree
個人的な設計原則

 全ての Actor は Supervisor 配下に設置

 Application:Supervisor Tree = 1:1 




                                      42
Supervisor Tree
全ての Actor は Supervisor 配下に設置

 Actor が孤独死するシステムは堅牢ではない




                               43
Supervisor Tree
Application:Supervisor Tree = 1:1 

  Supervisor を複数使いたい?

    Root の Supervisor の下に、それらの
    Supervisor を設置して一元管理




                                     44
Supervisor Tree

           Supervisor




  Worker   Worker       Supervisor




            Worker      Worker       Worker




                                              45
Supervisor Tree
Supervisor の仕事

 配下の Actor の起動と停止に特化

 他の余計な仕事は行わない




                       46
Supervisor Tree
Supervisor 毎の設定(抜粋)

 停止した Actor のみ再起動(one_for_one)

 停止した Actor と同じ Supervisor 配下の
 Actor を全て再起動(one_for_all)




                                 47
Supervisor Tree
Supervisor 毎の設定(抜粋)

 一定の秒数以内に一定の回数以上 Worker の起
 動停止を繰り返したら Supervisor を終了

   再起動しても何度も同じ理由で停止する状態
   を避ける




                             48
Supervisor Tree
Worker 毎の設定(抜粋)

 必ず再起動(permanent)

 異常終了した場合だけ再起動(transient)

 再起動しない(temporary)

 終了処理のタイムアウト時間




                            49
本日のお題
Erlang と Scala の紹介

Actor モデル

リンクによる相互監視

Supervisor Tree 

Error Logger 

例外


                     50
Error Logger
エラーハンドリングの仕組み

Erlang OTP 

Erlang では、catch されなかった例外は
Error Logger で処理される

OTP の Event Manager Behaviour で作られ
ている

  Erlang Behaviour = Scala Trait

                                     51
Error Logger
Event Manager 

  予め任意の Event に幾つかの Event
  Handler を登録しておくと、その Event が
  発生した際に、登録済みの複数の Event
  Handler を全て実行する




                                52
Error Logger
デフォルトで、エラーログを TTY に出力する
Error Handler が登録されている

OTP の System Application Support
Libraries(SASL) を起動すると…

  エラーログをファイルに残す

  エラーログファイルをローテションする

などの設定ができる Error Handler を追加する

                                   53
Error Logger
SASL の Error Handler

  速度を上げるため、バイナリ形式でログを残す

    専用のログを読むアプリケーション(rb)を使
    用しないとログが読めない

  エラーメッセージが少し解り難い




                             54
Error Logger
Lagger 

 SASL が性に合わない人向け

 Riak の Basho 製

 解りやすいメッセージをテキスト形式でファイ
 ルに保存してくれる Handler が登録される




                            55
Error Logger
Scala(提案)

 Event Manager Trait を作る

 Event Manager Trait を extends した
 Error Logger Actor を作る

 Error Logger にメッセージを送る Trait
 を作る




                                    56
本日のお題
Erlang と Scala の紹介

Actor モデル

リンクによる相互監視

Supervisor Tree 

Error Logger 

例外


                     57
例外
最後に Actor とは関係無いのですが、Erlang
と Scala の例外についての余談をさせてください




                              58
例外
Erlang 

 Erlang には三つの例外がある

   error 

   throw 

   exit 




                     59
例外
Erlang 

 error 

   システムエラーであり、呼び出し側が対処で
   きないエラーである場合に使用する

   意図的に起こす事もできるが、パターンマッ
   チの失敗等で自動的に発生する

   error は catch 非推奨

                          60
例外
Erlang 

 throw 

   呼び出し側が対処できるかもしれないエラー
   である場合に使用する

   呼び出し側は、対処できないと判断した場
   合、無理に catch しなくとも良い




                          61
例外
Erlang 

 exit 

   Actor を停止する際に使う




                     62
例外
 Erlang


try
  foo(),
  bar()
catch
  error:foo       -> handle_foo();
  throw:bar       -> handle_bar();
  Class:Exception -> handle_error(Class, Exception)
after
  baz()
end.



                                                      63
例外
Scala 

 チェック例外が無い

 例外は、なるべく異常事態に限定する

   Actor や STM の内部での利用は必要悪

 Java の throw 宣言されているメソッドを使
 用する際、catch しなくともコンパイル時にエ
 ラーとはならない

                              64
例外
Scala 

 回復可能な想定内のエラーは、Option や
 Either に包んで返す

 Java メソッドの例外は、
 scala.util.control.Exception.allCatch 
 で Option/Either に包む




                                          65
例外
 Scala


import scala.util.control.Exception.allCatch

def foo(): Either[Throwable, Foo] = allCatch either
{new JavaFoo}
def bar(objFoo: Foo): Either[Throwable, Bar] =
allCatch either {new JavaBar(objFoo)}

val result: Either[Throwable, Bar] = for {
    objFoo <- foo().right
    objBar <- bar(objFoo).right
} yield objBar


                                                      66
ご清聴ありがとうございました




                 67

Weitere ähnliche Inhalte

Andere mochten auch

Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...
Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...
Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...
Dr. Kate Mastruserio Reynolds
 

Andere mochten auch (14)

SORACOM interstellar 紹介資料
SORACOM interstellar 紹介資料SORACOM interstellar 紹介資料
SORACOM interstellar 紹介資料
 
Kademlia
KademliaKademlia
Kademlia
 
Cloud Functionsの紹介
Cloud Functionsの紹介Cloud Functionsの紹介
Cloud Functionsの紹介
 
結晶と空間充填 #ロマ数ボーイズ
結晶と空間充填 #ロマ数ボーイズ結晶と空間充填 #ロマ数ボーイズ
結晶と空間充填 #ロマ数ボーイズ
 
"16 Trends Shaping the Future of Ethical Leadership"
"16 Trends Shaping the Future of Ethical Leadership""16 Trends Shaping the Future of Ethical Leadership"
"16 Trends Shaping the Future of Ethical Leadership"
 
LA CRÓNICA 740
LA CRÓNICA 740LA CRÓNICA 740
LA CRÓNICA 740
 
1. la persona de pedro
1. la persona de pedro1. la persona de pedro
1. la persona de pedro
 
Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...
Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...
Math Discourse colloquium with Dr. Lucianna de Oliveira and Ms. Judith O'Loug...
 
sharechart Technical Newsletter vol-2 issue-65
sharechart Technical Newsletter vol-2 issue-65sharechart Technical Newsletter vol-2 issue-65
sharechart Technical Newsletter vol-2 issue-65
 
Demystifying blockchain
Demystifying blockchainDemystifying blockchain
Demystifying blockchain
 
Pos E-commerce e Marketing Digital
Pos E-commerce e Marketing DigitalPos E-commerce e Marketing Digital
Pos E-commerce e Marketing Digital
 
A Case Study in Attacking KeePass
A Case Study in Attacking KeePassA Case Study in Attacking KeePass
A Case Study in Attacking KeePass
 
ところで皆さん、上司の承認を得るプレゼンが目的でよい?
ところで皆さん、上司の承認を得るプレゼンが目的でよい?ところで皆さん、上司の承認を得るプレゼンが目的でよい?
ところで皆さん、上司の承認を得るプレゼンが目的でよい?
 
three.jsによる一歩進めたグラフィカルな表現
three.jsによる一歩進めたグラフィカルな表現three.jsによる一歩進めたグラフィカルな表現
three.jsによる一歩進めたグラフィカルな表現
 

Ähnlich wie Error handling in Erlang and Scala

Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミング
Jun Saito
 
東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?
koichik
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
Tetsuya Morimoto
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
Masatoshi Tada
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
日本Javaユーザーグループ
 

Ähnlich wie Error handling in Erlang and Scala (20)

Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミング
 
東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?東京Node学園#8 Let It Crash!?
東京Node学園#8 Let It Crash!?
 
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 Java
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
Example of exiting legacy system
Example of exiting legacy systemExample of exiting legacy system
Example of exiting legacy system
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する
【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する
【Ltech#10】LIFULL HOME'S ネイティブアプリ用APIのデプロイを自動化する
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組みJJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflow
 
Wtm
WtmWtm
Wtm
 

Error handling in Erlang and Scala