@hihihiroroのLog

ダラダラと。本ブログは、個人の意見であり、所属会社とは関係がありません。

「分散システムデザインパターン」を読んだ

誕生日プレゼントでもらったが5章くらいまでを繰り返していて、読み終わってなかったので一気読みした。

まえがきで書かれている通り、本書の目的は分散システムを作る、使う人達が共通言語で話ができるように汎用的なパターンが紹介されている。
別に限ってはないがコンテナを使っての設計、運用をする際に、何を知っていると楽になるかということがまとめられている。

シングルノードパターン

サイドカー

サイドカーの役割は、メイン処理を行うコンテナを拡張したり改善したりする。
サイドカーのメリットとして、

  • 個々の処理にリソースを割り振れる
  • 開発の責任分解がしやすい
  • いろんなコンテナの組み合わせができる
  • 障害がコンテナ内部に閉じれる
アンバサダ

メイン処理を行うコンテナとそれ以外の間のやり取りを仲介する仕組み。
シャーディングやサーキットブレーカ、リクエスト分割などをアンバサダが担当するので、メイン処理を行うコンテナはシンプルに作成することができる。またアプリケーションがどの環境でも同じ設定を使ったテストを行うことができるようになる。

アダプタ

アダプタが通信の形式を揃えるることで、中央の監視システムに共通したインタフェースを提供する仕組み。
これによって、メイン処理を行うコンテナには手を入れることなくインターフェイスを修正することができる。

マルチノードパターン

スキャッタ・ギャザー

リクエストを処理するために必要な演算をシャーディングする仕組み。
ルートに対してリクエストすると、ルートは処理を小さな部分問題に分割し、ワーカコンテナにばらまく。ばらまかれた処理が終わったら、ワーカコンテナは結果をルートに返す。この処理をフレームワーク化することで、

  • ルートがタスクを分割する部分
  • ワーカコンテナでの処理部分
  • 処理結果のマージ部分

を実装することでスキャッタ・ギャザーのフレームワークが使えるようになる。

ファンクションとイベント処理駆動

Fanction-as-a-Service の説明と使うべきパターンについて書かれている。
その中でデコレータパターンが紹介されている。デコレータパターンはリクエストまたはレスポンスの内容を変換するような、メイン処理の事前処理、事後処理を行うものとして使う。アダプタとは別に紹介されているのは、アダプタで実装してしまうとメイン処理と一緒にスケールしなければいけなくなる。デコレータは軽い処理が多いため、デコレータとメイン処理を別々にスケールできる方がメリットがある。

オーナーシップ選出

マスタ選出の実装方法として、PaxosやRaft のような分散コンセンサスアルゴリズムが有名だがとても難しい。
そこで、すでにコンセンサスアルゴリズムが実装されているコンテナを使い、オーナーシップ選出を行うことで、メイン処理には影響を与えずに複雑な機能のついっかを行うことができる。

バッチ処理パターン

ワークキューシステム

よく見るキューにためてワーカが順次処理するパターン。このパターンの場合処理を行うコンテナとキューに接続する部分が必要になる。この際キューはKafkaやRedisなど種類が色々あるため、キューに接続するインターフェース部分はアンバサダとして設計することをすすめている。

イベント駆動バッチ処理

あるワークキューの出力が他のワークキューの入力になるよう、ワークキュー同士をつなげることがある。

  • コピア
    ワークアイテムのストリームを1つ取り込み、それを2つあるいはそれ以上のストリームに複製する

  • フィルタ
    ある一定のルールに当てはまらないワークアイテムをフィルタすることで減らす

  • スプリッタ
    ルールに応じて異なる入力を異なるキューに送る

  • シャーダ
    1つのキューを何らかのシャーディング関数を元にしてワークアイテムの集合に均等に分割する

  • マージャ
    2つのワークキューを1つのワークキューにする

協調的バッチ処理

複数の出力を元にして結合された出力を生成するパターン

  • 結合(またはバリア同期)
    ワークアイテムの並列処理のすべてが完了後、結合処理が行われる。
    これによって結合処理の前にデータが欠けることがなくなるが、並列処理すべてが終わってからしか結合処理が行えないため処理が遅くなる可能性がある。

  • Reduce
    並列処理されたデータアイテム全部を1つの総合的なものに楽観的マージを行う。
    並列処理が継続中のものがあっても、Reduce は開始できる。最終的にはすべてのデータが処理される必要はあるが、結合よりも少しでも早く処理を開始できる。

まとめ

  • コンテナを使っての設計、運用をする際に役立つパターンがまとまってた
  • 複雑だったり、やることが違うものを切り出すことが多そう
  • パターンは1つだけ使うのではなく組み合わせて使うことが多そう
  • そこまでやるって言うのもあるようなないような…

マイクロサービスアーキテクチャ

マイクロサービスアーキテクチャ

  • 作者:Sam Newman
  • 発売日: 2016/02/26
  • メディア: 単行本(ソフトカバー)

試して学ぶ Dockerコンテナ開発

試して学ぶ Dockerコンテナ開発

入門 Kubernetes

入門 Kubernetes