Designing for Scalability with Erlang/OTPを読みました。Erlang/OTPを軸とした、スケーラブルなシステムを構築するための設計に必要な知見がたまってそうだったのと、半額程度で購入できたのでありがたく読みました。
内容として、半分はErlang/OTPのエコシステム周り、設計思想とかの話でした。ただ、残す半分はErlangに限ったことではない、広く使えそうな基礎がまとまっていました。個人的には、Elixir in Actionと合わせて読むとこの系統の書籍は十分そうな感覚です。
ちなみに、所どころ使われている例題や、それを個人的にElixirに書き直したものを以下に置いています。(所どころ壊れているものもありますが。)
https://github.com/KazuCocoa/erlang-scalable-design
前半部分
Erlang/OTPの全体的な話が書かれています。背景とか。message passingの概要とか。諸々。Erlangの文法も学びながら、gen_serverだったり、gen_fsmだったりといくつかのOTPの話に発展する感じでErlangを学ぶことができます。
debugのための、sysやdbgモジュールも記載されていました。以前読んだQiitaのReconTrace で Erlang VM のトレース機能に親しむでかかれていたrecon_traceなんかのことも言及されています。
proc_libという特別なプロセスの話も。この特別なプロセスは、
- システムメッセージや、イベント、シャットダウンとが可能
- 動的モジュールのリストを得ることができる
- debug flagを使ってトレースメッセージを利用することができる
といった特徴があります。
後半部分(Chapter13以降くらい)
Chapter 13のDistributed Architectureは、SOAやP2Pといった大局な設計やinterfaceから、その配布方法などの話まで色々ありました。これはErlangに特出したツールの話以外は、普通にErlang以外でも役立ちそうな情報だと思います。
リリース関係の話の中で、riakというdecentralized datastoreなツールの話もあって、面白かったです。Gossip protocolを使ってClusteringしているとか、そういう話も載っていたので。HashiCorpのSurfなんかでも結構知られていますね。Gossip protocol。
- Riakのそこらへんのドキュメントはこちら
- これのErlang client
- Elixir client
Scalableなシステムを組むためのtipsとして、以下の項目がまとめられていました。
- 分割する
- Distributed architectural pattern(cluster, SOAなど )
- Network protocol
- node間のinterfaceや状態も持ちようやデータモデル
- node間のretry strategy
- node間のsharing data strategyとか
Chapter14は可用性(availability)をより高めるための話。例えばuptime99.999%の物とか。Fault toleranceの話もここで本腰になってきます。このScalabilityのために、availability、reliability、consistencyのトレードオフの話があります。これらには、例えばlatencyの話とかも含まれます。
- failからの回復に関して
- Availability
- exactly once < at least once > at most once
- Consistency
- exactly once > at least once > at most once
- Availability
- データの共有
- Availability
- share everything < Share something > Share nothing
- Reliability
- share everything > Share something > Share nothing
- Availability
テストに関しても言及されていました。Capability Testingとして、これはmustなやつですね。
- Soak Testing
- 長時間稼働させておく
- Spike testing
- 高負荷の時に正しく復帰できるか、耐えることができるか
- Stress testing
- 負荷を上昇させてボトルネックかシステムの上限に達するかどうか
- Load testing
- 上限に近い負荷をかけ続けてどうか
ツール群
とか、3rd party SaaSとか。
あとはモニタリングの話とか。
締め
分散システムに対する話として、Erlang/OTPの話はとてもまとまっていますね。Elixirに踏み込むとやはりここは大事な所だし、純粋にシステムの理解としても大事な所。
また、early releaseが終わった段階でChapter13以降は読み直そう。
1 Comment