Weitere ähnliche Inhalte
Ähnlich wie Error handling in Erlang and Scala (20)
Error handling in Erlang and Scala
- 8. Erlang と Scala の紹介
何故、Actor モデルの話をするために Erlang
と Scala を選んだのか?
私が他の Actor モデルを実装したライブラ
リや言語を知らない
本日、話す予定のリンクによる相互監視が、
他の Actor 実装に採用されているか不明
7
- 9. Erlang と Scala の紹介
Erlang
ネットワークサーバを作るための DSL
並行と分散が得意
高い耐障害性
稼働率 99.9999999% も夢ではない
8
- 10. Erlang と Scala の紹介
Erlang
Yaws, Mochiweb, RabbitMQ, CouchDB,
Hibari, Riak, Kai, Scalaris,
Ejabberd, etc..
Tsung や BashoBench のような負荷試験
ツールも作りやすい
モジュールや関数を物理的に離れたノードに転
送できるので MapReduce なども得意
9
- 11. Erlang と Scala の紹介
Scala
様々な言語の長所を集めた次世代言語
夢と希望が詰ってる
並行処理に関連するキーワードだけでも…
Thread, Actor, 部分継続, 並列コレク
ション, 非同期IO, CAS, STM, etc..
10
- 12. Erlang と Scala の紹介
Scala
選択肢が多く、組み合わせも自由
Actor + STM
Actor + 継続
Actor + 非同期IO
継続 + 非同期IO
11
- 17. Actor モデル
世の中の全ては Actor である
全ての Actor は並行に動作する
Actor は、個々にローカルメモリを持ち、
Actor 間でメモリ共有を行わない
Actor は、自分自身や他の Actor とメッセー
ジを送受信しながら処理を行う
14
- 20. Actor モデル
Erlang と Scala には実装されていないが…
Actor はノードを越えて移動できる
暇なノードへ働きに行ったり
壊れたノードから逃げたり
17
- 21. Actor モデル
Mailbox Actor Mailbox Actor
message message receive
Receive Send
Message Message
Create Mailbox Actor
18
- 28. リンクのよる相互監視
EXIT シグナル
EXIT シグナルを受信した Actor は、
trap_exit が true か否かで動作が異なる
Erlang では、trap_exit が true の
Actor をシステムプロセスと呼ぶ
25
- 29. リンクのよる相互監視
システムプロセス(Erlang)
trap_exit 停止理由 動作
TRUE kill 停止:killed をブロードキャスト
TRUE X {'EXIT', Pid, X} をメールボックスに追加
FALSE normal 無視
FALSE kill 停止:killed をブロードキャスト
FALSE X 停止:X をブロードキャスト
26
- 37. リンクのよる相互監視
JavaScript
var num = get_number();
switch (num) {
case 1:
do_samething1();
break;
case 2:
do_samething2();
break;
default:
throw "Exception: " + num;
break;
}
34
- 38. リンクのよる相互監視
Erlang
case get_numer() of
1 -> do_samething1();
2 -> do_samething2()
end.
1, 2 以外で例外 {case_clause, 戻り値} が発生
35
- 39. リンクのよる相互監視
Erlang
do_samething(get_number()).
do_samething(1) -> do_samething1();
do_samething(2) -> do_samething2().
1, 2 以外で例外 {function_clause, 戻り値} が発生
36
- 48. Supervisor Tree
Supervisor
Worker Worker Supervisor
Worker Worker Worker
45
- 56. Error Logger
デフォルトで、エラーログを TTY に出力する
Error Handler が登録されている
OTP の System Application Support
Libraries(SASL) を起動すると…
エラーログをファイルに残す
エラーログファイルをローテションする
などの設定ができる Error Handler を追加する
53
- 57. Error Logger
SASL の Error Handler
速度を上げるため、バイナリ形式でログを残す
専用のログを読むアプリケーション(rb)を使
用しないとログが読めない
エラーメッセージが少し解り難い
54
- 59. Error Logger
Scala(提案)
Event Manager Trait を作る
Event Manager Trait を extends した
Error Logger Actor を作る
Error Logger にメッセージを送る Trait
を作る
56
- 63. 例外
Erlang
error
システムエラーであり、呼び出し側が対処で
きないエラーである場合に使用する
意図的に起こす事もできるが、パターンマッ
チの失敗等で自動的に発生する
error は catch 非推奨
60
- 64. 例外
Erlang
throw
呼び出し側が対処できるかもしれないエラー
である場合に使用する
呼び出し側は、対処できないと判断した場
合、無理に catch しなくとも良い
61
- 66. 例外
Erlang
try
foo(),
bar()
catch
error:foo -> handle_foo();
throw:bar -> handle_bar();
Class:Exception -> handle_error(Class, Exception)
after
baz()
end.
63
- 69. 例外
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