分散システムデザインパターンメモ

学びから何が得られるか

  • 車輪の再開発防止
  • 共通言語(ユビキタス言語的なイメージ)

分散システムのメリット(導入の目的)

  • スケーラビリティ向上
    • 秒間リクエスト数
    • 提供状態
    • リクエスト処理時間
  • 信頼性向上
  • 再利用による開発速度向上

分散システムのデメリット(導入の弊害)

  • デバッグが困難になる。
  • ...

分散システム導入にあたっての留意点

  • 再利用性の考慮
    • コンテナのパラメータ化
    • コンテナのAPI仕様の設計
    • コンテナのオペレーションのドキュメント化

パターン

シングルノードパターン(≒ Podの実装パターン)

シングルノードの導入目的

シングルノードであっても、役割毎にコンテナで分離することでメリットがある

  • コンテナ毎に適切なサービスレベルの設定・制御が可能となる
  • コンテナ毎にチームが分離でき、並行開発が可能となる
  • コンテナ毎に関心事が分離でき、複雑性を低減できる

パターン

パターン名 概要 メインコンテナとの関係 利用例
サイドカー メインコンテナ機能の拡張・補完 メインコンテナはこれがなくても単独で動ける ・SSL終端
・設定ファイルの同期
アンバサダ メインコンテナが外部サービスを利用する際に代理で通信 メインコンテナはこれがなくなると動けない ・外部サービスのシャーディング対応
・サービスブローカー(サービスディスカバリする人)
・カナリアリリース対応
アダプタ 外部サービスからメインコンテナへの接続に応答もしくは適応するよう対応
つまり、外部へのインターフェースの統一
メインコンテナはこれがなくても単独で動ける ・監視
・ロギング
・ヘルスモニタ

マルチノードパターン

分散パターン

パターン名 概要 恩恵 利用例
ロードバランス ステートレスなPodのレプリカに処理を振り分ける 信頼性の向上
冗長性の実現
リクエスト数のスケーラビリティ
・WebAPI
シャーディング ステートフルなPodのレプリカに処理を振り分ける
振り分け先は固定する
データサイズに対するスケーラビリティ ・キャッシュ
スキャッタ・ギャザー ルートノードへのリクエストを複数のタスクに分割し、リーフノードに分配。結果を集約し応答 処理時間のスケーラビリティ ・分散ドキュメント検索
適用を検討すべき技術
  • コンシステントハッシュ関数
  • ホットシャーディング

FaaS

特徴
  • 用意するのはコードのみ
  • 自動でスケールされる
  • マシン障害は自動でリトライ
  • ステートレスなため疎結合
デメリット
  • 疎結合がゆえに
    • 通信はネットワークのみ
    • メモリが有効活用できない
    • 全体像の把握が困難
    • 障害調査やトレースが困難
導入の判断基準
向いている処理
  • 他サービスの起動トリガー
  • リクエスト課金向きの処理
    • ただし、ずっと起動しているくらいリクエストが発生するなら別の仕組みの方がよい
向いていない処理
  • (優先度が低く)実行時間が長い処理
    • つまり、データ処理には不向き
  • リソース課金向きの処理
利用例
  • デコレータパターン
    • リクエストへのデフォルト値設定
  • 二要素認証
  • パイプライン処理
kubeless

Kubernetes-native serverless framework

オーナーシップの選出

  • マスタ選出
    • オペレータ
  • ロック
    • ロックの期限延長
    • 期間指定ロック

バッチ処理

ワークキューパターン

ワーカをJobリソースで起動する感じ。登場する役割は以下の通り。

  • ワークキュー_マネージャコンテナ
  • ワークキュー_ソースコンテナ(アンバサダ)
  • ワークキュー_ワーカマネージャコンテナ
  • ワークキュー_ワーカコンテナ

マルチワーカパターン

イベント駆動バッチ(FaaSに似ている)。登場する役割は以下の通り。

  • コピア(アイテムの複製)
  • フィルタ(アイテムのフィルタ)
  • スプリッタ(アイテムの種別による振り分け)
  • シャーダ(シャード関数による振り分け)
  • マージャ(アイテムを1つのキューに集約)

ストリーム管理手法

  • ファイルシステムを使いディレクトリ内のファイルを監視
  • pub/sub基盤を使用

協調的バッチ処理

  • 結合(=バリア同期)
    • キューを集約+全アイテムが揃ったことを保証
  • Reduce
    • 目的は待つことではなくデータのマージ
    • すべての入力が揃わなくてもReduce処理を開始する点が結合とは異なる

参考

共通ラベル

Label Schema
Bringing Structure To Labels
タイトルとURLをコピーしました