Skip to content

Instantly share code, notes, and snippets.

@lowbridgee
Last active August 16, 2019 09:57
Show Gist options
  • Save lowbridgee/6c38dd053ad190c822ebc90915584d07 to your computer and use it in GitHub Desktop.
Save lowbridgee/6c38dd053ad190c822ebc90915584d07 to your computer and use it in GitHub Desktop.
データ指向アプリケーションデザイン自分用まとめ

概要

  • 現在の多くのアプリケーションはデータ指向
    • データベース、キャッシュ、検索インデックス、ストリーム処理、バッチ処理などの機能が必要
    • タスクに対してどの手法、ツール、組み合わせが適切かを判別しないといけない
  • この章では、実現目標の信頼性、スケーラビリティ、メンテナンス性の概要を見る

信頼性

  • 障害があったとしても正しく動作し続けること
  • 色々なフォールトがある(ハードウェア、ソフトウェア、ヒューマンエラー)
  • ハードは冗長化したりソフトウェアでの耐障害性を高めるとダウンタイムとかなくなっていいよね
    • ローリングデプロイができるとシステムのダウンタイムなくなっていいよね
  • 正しいことを行いやすく間違ったことを起こさないシステム設計ができるといいよね
  • リカバリを素早くできるようにしよう
  • 信頼性を損なった時に何が起こるかのコストの判断はするようにしよう

スケーラビリティ

  • システムの成長に対して無理なく対応可能であること
  • どう計算資源を追加すれば負荷に対応できるか?を考えておくこと
  • 負荷を表現して(リクエスト数とかデータベース読み書き数とか)、負荷を増やした時にパフォーマンスにどう影響が起こるのか調べる
  • リクエストタイムのパーセンタイルを見てどこを改善するかみることがある(典型的なレスポンスタイムを改善するのか、外れ値部分を改善するのか)
  • 色々負荷対処方法はある
    • スケールアップ
    • スケールアウト
  • が、どういった処理が頻繁に起こり、この処理は稀にしか起こらないという負荷の推定を行わないと的外れなスケーリングになるよ

メンテナンス性

  • 既存動作のメンテナンスと新しいユースケースへの対応が可能であること
  • 運用しやすく、システムが理解しやすく、未来に起こる予想外のユースケースに対応しやすくしよう

データモデルとクエリ言語

概要

  • 多くのアプリケーションはいくつものデータモデルの積み重ねで構築される
  • データモデルには想定される利用方法があるので、アプリケーションに適したデータモデルを選ぶのは重要
  • この章ではデータの保存とクエリのための汎用的なデータモデルを見ていく

リレーショナルモデルとドキュメントモデル

  • ビジネスデータの処理を行うのにリレーショナルデータベースが生まれた
    • トランザクション処理やバッチ処理
  • 現在に至るまでリレーショナルデータベースは最も使われている
  • NoSQLが誕生
  • 今だとリレーショナルモデルとドキュメントモデルが選択肢に上がる
    • ドキュメントモデルはスキーマの柔軟性とローカリティによる優れたパフォーマンスが良い点
    • リレーショナルモデルは多対多の関係のサポートに優れるのが良い点

データのためのクエリ言語

  • SQLは宣言的なのが良い
    • クエリの実行順序などはオプティマイザの判断になる
    • データの取り方を指定しないのでデータベースエンジンの実装詳細も隠蔽できる
    • 実行順序をオプティマイザ判断にしているので並列化しやすい
  • Web上でもCSSやXSLは宣言的
  • MapReduce
    • 大量データを多くのマシンを使ってまとめて処理するためのモデル
    • 宣言的なクエリと命令的なクエリの中間くらいのモデル
  • グラフ型のデータモデル
    • 頂点(ノード、エンティティ)と辺(エッジ、関係)の2つで構成される
    • ソーシャルグラフ、Webグラフ、鉄道網などがモデル化できる
    • 全く異なる種類のオブジェクトを単一データストアに入れられるモデルでもある(Facebookとか)
    • プロパティグラフモデルとトリプルストアモデルを取り上げている
      • プロパティモデルの構成要素 - 頂点(ユニーク識別子、外向きの辺集合、内向きの辺集合、プロパティ)、辺(ユニーク識別子、始点、終点、頂点間の関係ラベル、プロパティ)
      • トリプルストアモデルの構成要素 - (主語、述語、目的語)

まとめ

  • 関係の表現のためリレーショナルモデルが開発される
  • うまく適用できないアプリケーションに気づいた開発者はドキュメントデータベースとグラフデータベースの2つを考案
  • それぞれが対象とする領域に適しているので、アプリケーションの目的ごとに使うモデルを選べるといいよね
  • 紹介したモデルの内部実装によるトレードオフは次章!

ストレージと抽出

概要

  • データベースの役割は 与えられたデータの保存 そのデータを要求されたら返すこと
  • 2章では開発者がデータベースに値を渡す時のフォーマットと呼び出しの仕組みをやった
  • アプリケーションにあったストレージエンジンを使えるようになろう
  • そのためにストレージエンジンの裏側を大まかに説明する
    • トランザクションに対して最適化されたエンジンと分析に対して最適化されたエンジンだと大きな違いがあるので紹介する
  • まずはlog-structuredストレージエンジンとページ指向ストレージエンジン

データベースを駆動するデータ構造

  • ファイルに対して(key,value)を追記していくログが最も単純なデータベース
    • パフォーマンスはかなり良い
    • keyでの探索コストがO(n)になるのでインデックスが必要になる
  • インデックスの話
    • log-structuredインデックス
    • 最も良く使われてるのがBツリーインデックス
      • アルゴリズム上、ツリーのバランスが保たれるので深さがO(nlogn)になる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment