読書メモ:データ指向アプリケーションデザイン(1)
「監訳者まえがき」から「1.2 信頼性」までのサマリ。 キーワードとか気になったことをピックアップした。
社内で講義形式の勉強会を開催するために準備したんだけど
参加者が集まらなかったので結局やってない😟
目次
監訳者まえがき
- 本書は「分散システム入門の決定書」
- CPU の性能は伸び悩み、クラウドは普及し、多数のマシンを活用する分散処理の時代になった
- 分散システムの難しさ
- これまでに分散システムの入門書はなかった
- 知識をアップデートし続けるのは大変
- 本書の目的は 100%の可用性(理想)という幻想を捨て、99.99% の実用的な可用性(期待した動作をする)を目指す考え方を養うこと
- 特に冪等性を実現するにはいろんなことを考えないといけない
第Ⅰ部データシステムの基礎
- いろいろな要因があり、データベースや分散システム、それらを基盤とするアプリケーションの構築手法がいろいろと発展してきた
- 「データ指向」の意味
- CPUがボトルネックとなるアプリケーションを演算指向と呼ぶ
- データ量やデータ構造の複雑さ、データの変化の速さが重要なアプリケーションのことをデータ指向と呼ぶ
- バズワードの氾濫は新しい可能性に対する期待
- データの処理と保存の技術は急速に変化し続けている
- 本書の対象読者
- 本書で紹介している参考文献やオンラインリソースは Github に公開している
第1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション
- データ指向アプリケーションの基本機能(まとめてデータシステムと捉えている)
- データベース
- キャッシュ
- 検索インデックス
- ストリーム処理(他のプロセスへメッセージを送り、非同期に処理してもらう)
- バッチ処理(蓄積された大量のデータを定期的に処理する)
- それぞれの要素にさまざまな選択肢があるので、信頼性とスケーラビリティを実現し、メンテナンスしやすいデータシステムに求められる条件を解説していく
1.1 データシステムに関する考察
- 「データを保存する」という表面的な意味が同じなら、性能や実装の異なる機能を「データシステム」とひとまとめに考える理由はある
- アプリケーション開発者はデータシステムの設計者でもある
- いろいろと状況に依存する課題はあるけど、本書で着目するのは信頼性、スケーラビリティ、メンテナンス性
1.2 信頼性
- 直感的なイメージはいろいろあるけどざっくり整理すると「何か問題が生じたとしても正しく動作し続けること」が信頼性
- 問題を起こす可能性のある要素のことを「フォールト(fault)」と呼ぶ
- 「フォールト(fault)」は仕様を満たさない、という意味
- 「障害」はユーザーへサービスの提供を止めてしまった、という意味
- 障害の可能性は0にできないから、フォールトが障害に育たないように耐障害性の仕組みを設計する
- フォールトの存在を想定しているシステムを「耐障害性を持つ(フォールトトレラント fault tolerant)」、あるいは、「弾力性のある(レジリエント resilient)」と表現する
- 意図的にフォールトを発生させて耐障害性の仕組みを継続的に検証するのが Chaos Engineering
- 耐えた方がいいフォールトと、回避したほうがいい(回復不可能な)フォールトがある
1.2.1 ハードウェアエラー
- ハードディスクはクラッシュするし、RAM は欠陥が生じるし、電力網は停電するし、人間は引き抜くネットワークケーブルを間違える
- 大量のマシンを使用するアプリケーションが増加した結果、ハードウェアのフォールト発生率も増加している
1.2.2 ソフトウェアエラー
- ハードウェアの故障はランダムに発生するが、ソフトウェアのエラーは同時多発する可能性がある
- 同じロジックに同じデータを入力すればほぼ確実に再現する
1.2.3 ヒューマンエラー
- システムを設計、構築、運用する人間の信頼性の向上は努力しても限界がある
- 人間が信頼できないことを踏まえて複数のアプローチを組み合わせるのが優れたシステム
1.2.4 信頼性の重要度
- 業務システムでバグが発生すると生産性が損なわれるし、不正確な数値を報告する法的なリスクも生じる
- e コマースサイトの障害は機会ロスや評判の低下という深刻なダメージになるかもしれない
- 利用者に対する責任からは逃れられない
- 「信頼性を犠牲にする」ときは強く意識しておかなければならない