分散システムを正しく書くための言語機能を考える
可読性が高い・テストしやすいといったコードを書くにはどういった言語機能があればいいのか考えたい
難しいところ
Erlang だと、
メッセージがネットワークを越えるかわからない
透過的に扱えるのはいいところかもしれない
とはいえネットワーク越えるのはコストもかかるし現実的には越えるかどうか知りたい
どことどこが協調動作しているのかわからない。処理が追いにくい
どれが外から呼ばれているかわからない
これは設計に失敗しているだけかもしれない
単純に考えることが多すぎる
すべてのステップで死ぬ可能性がある
普通のプログラミングでは実行中に死なない仮定を置いている気がする (そうでもないかもしれない)
テストしづらい
レアケース見つけづらい
再現しづらい
IO が入ってくるから?
非決定性が面倒なので決定的にしたい
IO、というか分散・並行処理のランタイムを全部切り離せるようにしたい
それで決定的に動くようなランタイムを使ってテストしたい
Actor の configuration を一つずつすすめるみたいな感じで
型とか静的解析でやるなら
なにを不正として検知したいか
?
この故障モデルならこれが満たせるとか?
(並行計算の) モデル
分散アルゴリズムは、プロセスがあって非同期通信するモデルで書かれている事が多い
通信路はキューになっていることも多い
FIFO ではないこともあるし FIFO であるとしていることもある
プロセスはクラッシュしうる
素直に書きたい
各プロセスはステートマシンになっている
Actor?
やりたいこと
モジュラーにしたい
テストしやすくしたい
分散アルゴリズムを組み合わせやすくしたい
レイヤ構造になっている気がする
通信レイヤ
でも横の関係になっているのもある
hyparviewとplumtreeとか
hyparviewでメンバ管理して、そのメンバにメッセージをブロードキャスト
それらの下に通信レイヤ
上にはアプリケーション
レイヤというか、ただインタフェースが開いてて相互に利用できるというだけかも
直接呼び出しとイベント駆動
イベントというかストリーム?
なんかストリームを subscribe してる感じ
呼び出すのもストリームと見ればいいのか?
ストリーム=channel?
でも返り値が欲しいんだった
そもそもどんなのがあるんやろか