読書メモ:データ指向アプリケーションデザイン(1)

www.oreilly.co.jp

「監訳者まえがき」から「1.2 信頼性」までのサマリ。 キーワードとか気になったことをピックアップした。

社内で講義形式の勉強会を開催するために準備したんだけど
参加者が集まらなかったので結局やってない😟

目次

監訳者まえがき

  • 本書は「分散システム入門の決定書」
  • CPU の性能は伸び悩み、クラウドは普及し、多数のマシンを活用する分散処理の時代になった
  • 分散システムの難しさ
  • これまでに分散システムの入門書はなかった
  • 知識をアップデートし続けるのは大変
  • 本書の目的は 100%の可用性(理想)という幻想を捨て、99.99% の実用的な可用性(期待した動作をする)を目指す考え方を養うこと
    • 特に冪等性を実現するにはいろんなことを考えないといけない

第Ⅰ部データシステムの基礎

  • いろいろな要因があり、データベースや分散システム、それらを基盤とするアプリケーションの構築手法がいろいろと発展してきた
  • 「データ指向」の意味
    • CPUがボトルネックとなるアプリケーションを演算指向と呼ぶ
    • データ量やデータ構造の複雑さ、データの変化の速さが重要なアプリケーションのことをデータ指向と呼ぶ
  • バズワードの氾濫は新しい可能性に対する期待
  • データの処理と保存の技術は急速に変化し続けている
  • 本書の対象読者
    • なんらかの問題を解決するためのツールを選択するとか、最適な利用方法を見出さなければならないとかそういう立場の人に有益
    • 「私たちは GoogleAmazon じゃないんだからスケーラビリティとか気にせず RDB を使っていこう」そうはいっても RDB が常に最適解であるとは限らない
  • 本書で紹介している参考文献やオンラインリソースは Github に公開している

第1章 信頼性、スケーラビリティ、メンテナンス性に優れたアプリケーション

  • データ指向アプリケーションの基本機能(まとめてデータシステムと捉えている)
    • データベース
    • キャッシュ
    • 検索インデックス
    • ストリーム処理(他のプロセスへメッセージを送り、非同期に処理してもらう)
    • バッチ処理(蓄積された大量のデータを定期的に処理する)
  • それぞれの要素にさまざまな選択肢があるので、信頼性とスケーラビリティを実現し、メンテナンスしやすいデータシステムに求められる条件を解説していく

1.1 データシステムに関する考察

  • 「データを保存する」という表面的な意味が同じなら、性能や実装の異なる機能を「データシステム」とひとまとめに考える理由はある
  • アプリケーション開発者はデータシステムの設計者でもある
  • いろいろと状況に依存する課題はあるけど、本書で着目するのは信頼性、スケーラビリティ、メンテナンス性

1.2 信頼性

  • 直感的なイメージはいろいろあるけどざっくり整理すると「何か問題が生じたとしても正しく動作し続けること」が信頼性
  • 問題を起こす可能性のある要素のことを「フォールト(fault)」と呼ぶ
    • フォールト \neq 障害
    • 「フォールト(fault)」は仕様を満たさない、という意味
    • 「障害」はユーザーへサービスの提供を止めてしまった、という意味
      • 障害の可能性は0にできないから、フォールトが障害に育たないように耐障害性の仕組みを設計する
  • フォールトの存在を想定しているシステムを「耐障害性を持つ(フォールトトレラント fault tolerant)」、あるいは、「弾力性のある(レジリエント resilient)」と表現する
    • 意図的にフォールトを発生させて耐障害性の仕組みを継続的に検証するのが Chaos Engineering
    • 耐えた方がいいフォールトと、回避したほうがいい(回復不可能な)フォールトがある

1.2.1 ハードウェアエラ

  • ハードディスクはクラッシュするし、RAM は欠陥が生じるし、電力網は停電するし、人間は引き抜くネットワークケーブルを間違える
  • 大量のマシンを使用するアプリケーションが増加した結果、ハードウェアのフォールト発生率も増加している
    • ハードウェアの冗長化 + ソフトウェアで耐障害性を作り込むようになってきている
    • クラウドプラットフォームは信頼性より柔軟性やエラスティシティを重視している
      • 突然仮想マシンが動かなくなる、のはわりと当たり前になっている

1.2.2 ソフトウェアエラ

  • ハードウェアの故障はランダムに発生するが、ソフトウェアのエラーは同時多発する可能性がある
    • 同じロジックに同じデータを入力すればほぼ確実に再現する

1.2.3 ヒューマンエラー

  • システムを設計、構築、運用する人間の信頼性の向上は努力しても限界がある
  • 人間が信頼できないことを踏まえて複数のアプローチを組み合わせるのが優れたシステム

1.2.4 信頼性の重要度

  • 業務システムでバグが発生すると生産性が損なわれるし、不正確な数値を報告する法的なリスクも生じる
  • e コマースサイトの障害は機会ロスや評判の低下という深刻なダメージになるかもしれない
  • 利用者に対する責任からは逃れられない
  • 「信頼性を犠牲にする」ときは強く意識しておかなければならない