Featured image of post とある分散システムの設計で使ってた概念の棚卸し

とある分散システムの設計で使ってた概念の棚卸し

目次

背景

  • とある分散システム上で売買を行うシステムの、UML設計をする仕事をしていた
  • そのシステム上で、売買は平等なノード間で行われ、設計が大事だった
  • その時にSLAやTX性能など色々検証していたので、そのメモの一部を残す

ネット取引の本質

インターネット上の売買システムについて考える機会があった。結論以下になった。

  • ネット上の売買ではtxをアトミックにしなければならない
  • つまり、仲介者が本質的に必要だという事
    • 理由は相対取引が不可能だから(例えば、直接物々交換するなど)
    • なので、物とお金の交換で、どちらかが先にお金や物をgiveすることになる
    • その結果、あとでgiveする方が有利になり、逃げる事=カウンターパーティリスクが発生するから
    • 以下みたいな感じ
      1
      2
      
      Alice → Bob に送金
      Bob → Alice に送金する保証なし
      
  • 仲介者抜きではネットの売買は成り立たないという事
    • 三方良しにしないとこのメカニズムは成り立たない。
    • 二人だけだと利益相反であり、3人だともう一人に利益を渡してインセンティブが無いと、持ち逃げされるから
    • ブロックチェーンだって、OpenSeaみたいな仲介者がいないと本質的に成り立たない
    • エスクロー取引が必要という事

要件定義

ノックアウトファクター

  • 他の条件がどれほど優れていても、その要素を満たさない(または満たしてしまう)場合に即座に不採用・却下となる致命的な要因・要件のこと
  • これじゃぁ無理と言われる要項

非機能要件

  • セキュリティ要件
  • 法的要件
  • ネットワークのアクセス要件

システム検証

検証の5要素

  1. 運用
  2. パフォーマンス
  3. 開発コスト
  4. ランニングコスト
  5. セキュリティ

検証結果の共有の三要素

検証・実験・試験は次の三つがミニマムで必要。

  1. 前提
  2. 結果
  3. 結論

用語

信頼性・可用性の観点

RASIS, RAS

コンピュータシステムの信頼性を評価する5つの指標。

  • Reliability(信頼性)
  • Availability(可用性)
  • Serviceability(保守性)
  • Integrity(完全性)
  • Security(機密性)

セキュリティの三要素 (CIA)

  • C: 「機密性」(Confidentiality)
  • I: 「完全性」(Integrity)
  • A: 「可用性」(Availability)

SLI, SLO, SLA

  • Service Level Indicator
  • Service Level Objective
  • Service Level Agreement

別の言い方をすると

  • SLI → 何を測るか
  • SLO → どの水準を目標にするか
  • SLA → どの水準を契約・合意として扱うか

SLO (Service Level Objective)

  • レイテンシ
    • 予測値
      • 100ms (TTFB; 99.9パーセンタイル)
    • 通信してから帰ってくるまで
    • curlでいう、time_starttransferのTTFB (Time To First Byte)
    • 単一リクエストに対する応答遅延
    • API呼び出し、DBアクセス、ネットワーク往復などの単位で見る
  • スループット
    • 予測値
      • xxx req/s (書き込みで)
    • 秒間に書き込めるTXの数
    • apache benchmarkなどで実施する
  • コスト
    • 予測値
      • TBD 円/s
    • インスタンス費用とスループットから算出
  • ターンアラウンドタイム
    • 予測値
      • xxx ms
    • リクエストを送ってから帰ってくるまで
    • 実際にAPIを実行して何秒で返ってくるか
    • 業務処理やジョブ全体が完了するまでの時間
    • 例: 注文作成から確定まで、審査開始から完了まで
  • 同時接続数
    • 予測値
    • 同時に接続できる数

RAMS規格

システムの安全性と信頼性のための規格

  • 信頼性 (reliability)
  • アベイラビリティ (availability)
  • 保守性 (maintainability)
  • 安全性 (safety)

整合性・可用性の観点

TxのACID特性

特にアトミック性と一貫性が大切。結果整合性もある。

  • Atomicity(原子性)
  • Consistency(一貫性)
  • Isolation(独立性)
  • Durability(永続性)

分散システムのCAPの定理

単一障害点(spof)をなくすことはここの可用性と関連。

  • 一貫性 (Consistency)
  • 可用性 (Availability)
  • 分断耐性 (Partition-tolerance)

BASE基準

高可用性を実現するための「システムの特性」のこと。

  • BA (Basically Available | 基本的に利用可能)
  • S (Soft state | 厳密ではない状態遷移)
  • E (Eventual consistency | 結果整合性)

キャパシティ

キャパシティプランニングの3つの観点

  1. latency
  2. throughput
  3. turnaround time

キャパシティ

  • バックプレッシャー
  • サーキットブレーカーパターン

分散システム

分散システムのTXパターン

  • 2 Phase Commit
    • 全ノードがコミットするか、それとも全ノードがコミットしないかのどちらかの状態になることを保障するプロトコル
  • 3 Phase Commit
    • コミットリクエスト、コミット準備、コミットの3段階でメッセージをやり取りするモデル
  • Sagaパターン
    • 複数の状態変更を調整できリソースを長時間ロックすることがないよう設計されたアーキテクチャパターン
    • Choreography (コレオグラフィ)と、Orchestrationパターンがある
    • 補償トランザクションの設計も必要
  • Try-Confirm/Cancelパターン

ノードのコンセンサスアルゴ

  • Paxos
  • Raft
  • BFT(Byzantine Fault Tolerance)

二重実行・冪等性

  • 二重決済の問題
  • 二重注文の問題
  • リトライ時に二重実行
  • idempotency key

運用

障害モデル

  • Fail-Stop障害モデル
  • Fail-Recover障害モデル
  • Byzantine障害

運用設計

  • 定期実施作業
  • インシデント対応
  • セキュリティ対応
  • キャパシティプランニング

業務フロー・システムフロー

  • アカウントの発行
  • アカウントの審査

設計

全体設計

誰が何をやるで全体的な設計をする。

  • アクター・システム
    • エンドユーザー
    • オペレーター
    • アドミン
  • ユースケース分類
    • エンドユーザー機能
    • オペレーター機能
    • アドミン機能

2つの詳細設計の方法

  1. 個別設計
  2. 横断設計

Usecase

Usecaseの必須項目

  • ユースケースID
  • ユースケース名
  • アクター
  • 目的
  • パラメーター
  • 備考

3つのフローとパラメーター

  • メインフロー = 期待通りに進む流れ
  • 代替フロー = 期待通りではないが、正常な別パターン
  • 例外フロー = エラー・失敗時の流れ

フローを進むための条件

  • 開始条件 = きっかけ
  • 事前条件 = 始める前の前提
  • 事後条件 = 終わった後の結果

確認項目

  • シナリオテスト
  • リーガルチェック

結論

  • 分散システムの設計は難しい
  • 特に障害点が無い代わりにスループットが上げにくい
  • コンソーシアム型にしてもノード間のコンセンサスを取るのは大変
Built with Hugo
テーマ StackJimmy によって設計されています。