イベント・ソーシングを知る

 より価値の高いソフトウェア開発
      のために
なんのはなし?
• ソフトウェアの設計的な話
• ソフトウェアの情報をどのように永続化
  して扱うか(ソーシング, Sourcing)
• いつもと少し違うアプローチを紹介しま
  す
例: 本のレンタルサービス
1.   ユーザが本を登録する
2.   本はユーザなら誰でも借りられる
3.   本を借りた人が本を返す
4.   本がまた借りられるようになる(2に戻る)
「フツーに」考える
たぶんこうなる




                      本テーブル的なもの
タイトル           貸し出し
ONE PIECE
NARUTO
たぶんこうなる
1. スタンが「HUNTER×HUNTER」を登録




   タイトル            貸し出し
   ONE PIECE
   NARUTO
   HUNTER×HUNTER
たぶんこうなる
1. スタンが「HUNTER×HUNTER」を登録
2. カイルが「HUNTER×HUNTER」を借りる




  タイトル            貸し出し
  ONE PIECE
  NARUTO
  HUNTER×HUNTER   カイルが借り出し中
たぶんこうなる
1. スタンが「HUNTER×HUNTER」を登録
2. カイルが「HUNTER×HUNTER」を借りる
3. カイルが「HUNTER×HUNTER」を返す


  タイトル            貸し出し
  ONE PIECE
  NARUTO
  HUNTER×HUNTER
たぶんこうなる
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる

      タイトル            貸し出し
      ONE PIECE
      NARUTO
      HUNTER×HUNTER   ケニーが借り出し中
状態を中心に考える

ステート・ソーシング
ステート・ソーシング
•   従来の一般的な考え方
•   ステート=状態
•   状態中心のソフトウェア設計
•   あらゆる情報は状態が永続化される
• 最新の状態を常に記憶しておくのが一般
  的
フツーですね
見落とされがちな問題
• 現在の状態はわかるが…
• 状態が変化した理由や経緯が全て失われ
  る
• ソフトウェアにとって非常に価値の高い
  情報
• 履歴やログで記録をとるのは限界がある
ステート・ソーシングの問題を解決するために

イベント・ソーシングとは
イベント中心に捉える
• 様々な出来事(イベント)の結果、状態が変
  化する
• 「状態」はイベントの結果に過ぎず、本
  質ではないのではないか(という考え方)
イベントを記録する
• ソフトウェアで起こる全てのイベントを
  記録する
• 記録されたイベントは変更や削除をしな
  い
• 「状態」は記録しません!
• 何が起きたかだけを淡々と記録します
ほんとにそのまま記録します
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる

                             このままです
      タイトル            貸し出し
      ONE PIECE
      NARUTO
      HUNTER×HUNTER   ケニーが借り出し中
いやいや、でも状態は必要で
     しょ?
イベントを再生する
• 記録されたイベントを順に再生すること
  で、現在の状態を導出できる
• 1つずつイベントを辿れば必ず今の状態に
  たどり着きます
イベントを再生する順番に辿ります
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる
                     記録されているイベン
      タイトル        貸し出し    ト
      ONE PIECE
      NARUTO
イベントを再生する
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる

      タイトル            貸し出し
      ONE PIECE
      NARUTO
      HUNTER×HUNTER
イベントを再生する
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる

      タイトル            貸し出し
      ONE PIECE
      NARUTO
      HUNTER×HUNTER   カイルが借り出し中
イベントを再生する
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる

      タイトル            貸し出し
      ONE PIECE
      NARUTO
      HUNTER×HUNTER
イベントを再生する
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる

      タイトル            貸し出し
      ONE PIECE
      NARUTO
      HUNTER×HUNTER   ケニーが借り出し中
イベントを再生する
1.   スタンが「HUNTER×HUNTER」を登録
2.   カイルが「HUNTER×HUNTER」を借りる
3.   カイルが「HUNTER×HUNTER」を返す
4.   ケニーが「HUNTER×HUNTER」を借りる
                             最新の状態が再現
      タイトル            貸し出し
      ONE PIECE
      NARUTO
      HUNTER×HUNTER   ケニーが借り出し中
イベント・ソーシングのすごいと
      ころ
• ソフトウェアの完全な履歴が手に入る
• ソフトウェアの任意の部分あるいは全体
  を「ある時点」に簡単に再現できる
• 有用な設計と相性が良い
 – ドメイン駆動設計(DDD)
 – コマンドクエリ責務分離(CQRS)
イベント・ソーシングすごい!
残念ながら問題点も
パフォーマンス
• 「最新の状態」を得るために、毎回膨大
  な量のイベントをリプレイしていたら大
  変
• 大量のイベントを捌かなければならない
• ストレージ容量を多く使用する可能性
バージョニング
• 仕様変更が起こったら、過去のイベント
  をどう処理するか
• 最新の状態のみ影響を考えればよいス
  テート・ソーシングと違って、大量の過
  去のイベントにも影響が出る
実装が複雑
• イベントを記録してリプレイする機構を
  実装しないといけない
• 様々な問題に対処するために、様々な仕
  組みを導入する必要があり、さらに複雑
  さに輪をかける
 – キャッシング
 – イベントのアップデータ
 – 参照系の処理への対処
最後に
• ステート・ソーシングの問題を認識する
 – 当たり前すぎて気づかなかったり
• イベント・ソーシングの可能性
 – いろいろ問題はありますが、ステート・ソー
   シングでは成し得ない価値の提供ができるの
   では?
参考
• Greg Young流CQRS - Mark Nijhof
• Why Event Sourcing?
• Event Sourcing and CQRS, Let's use it.
• state ソーシング、 event ソーシング 【ス
  タイルの選択肢】
• event とメッセージング 【きっと、良い
  パターン】

More Related Content

PDF
マイクロサービス 4つの分割アプローチ
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
リッチなドメインモデル 名前探し
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
ソーシャルゲームのためのデータベース設計
PDF
世界でいちばんわかりやすいドメイン駆動設計
PDF
ドメイン駆動設計 本格入門
PDF
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発
マイクロサービス 4つの分割アプローチ
ドメインオブジェクトの見つけ方・作り方・育て方
リッチなドメインモデル 名前探し
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
ソーシャルゲームのためのデータベース設計
世界でいちばんわかりやすいドメイン駆動設計
ドメイン駆動設計 本格入門
【BS13】チーム開発がこんなにも快適に!コーディングもデバッグも GitHub 上で。 GitHub Codespaces で叶えられるシームレスな開発

What's hot (20)

PDF
イミュータブルデータモデルの極意
PDF
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
PDF
Docker Compose 徹底解説
PDF
Dockerからcontainerdへの移行
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
PPTX
MongoDBが遅いときの切り分け方法
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
マイクロサービス化に向けて
PPTX
Dockerからcontainerdへの移行
PPTX
初心者向けMongoDBのキホン!
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
そんなトランザクションマネージャで大丈夫か?
PDF
ドメイン駆動設計のためのオブジェクト指向入門
PDF
PHPからgoへの移行で分かったこと
PDF
マイクロにしすぎた結果がこれだよ!
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PDF
例外設計における大罪
PPTX
Redisの特徴と活用方法について
PDF
MongoDB〜その性質と利用場面〜
イミュータブルデータモデルの極意
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Docker Compose 徹底解説
Dockerからcontainerdへの移行
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
MongoDBが遅いときの切り分け方法
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
マイクロサービス化に向けて
Dockerからcontainerdへの移行
初心者向けMongoDBのキホン!
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
そんなトランザクションマネージャで大丈夫か?
ドメイン駆動設計のためのオブジェクト指向入門
PHPからgoへの移行で分かったこと
マイクロにしすぎた結果がこれだよ!
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
例外設計における大罪
Redisの特徴と活用方法について
MongoDB〜その性質と利用場面〜
Ad

Viewers also liked (14)

PPTX
S3をDB利用 ショッピングセンター向けポイントシステム概要
PPTX
AWS活用のいままでとこれから -東急ハンズの事例-
PPTX
CQRS+ESをAkka Persistenceを使って実装してみる。
PDF
Scala with DDD
PDF
From ActiveRecord to EventSourcing
PPTX
JAWS FESTA Kyusyu LT_ハンズラボ青木由佳
PDF
Jaws festa 2015 <40歳の開発のpmが未経験でインフラエンジニアになってみて>
PDF
JAWSFESTAKyusyu_JAWSで学べることってなぁに_ゆかりんあゆゆ_20151103
PDF
[DO07] マイクロサービスに必要な技術要素はすべて Spring Cloud にある
PDF
SharePoint Online Communication Sites お手軽サイト作成
PDF
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
PDF
マイクロサービスアーキテクチャ とは何か
PPTX
当たり前を当たり前に:Agile2017レポート
PDF
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
S3をDB利用 ショッピングセンター向けポイントシステム概要
AWS活用のいままでとこれから -東急ハンズの事例-
CQRS+ESをAkka Persistenceを使って実装してみる。
Scala with DDD
From ActiveRecord to EventSourcing
JAWS FESTA Kyusyu LT_ハンズラボ青木由佳
Jaws festa 2015 <40歳の開発のpmが未経験でインフラエンジニアになってみて>
JAWSFESTAKyusyu_JAWSで学べることってなぁに_ゆかりんあゆゆ_20151103
[DO07] マイクロサービスに必要な技術要素はすべて Spring Cloud にある
SharePoint Online Communication Sites お手軽サイト作成
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
マイクロサービスアーキテクチャ とは何か
当たり前を当たり前に:Agile2017レポート
マイクロサービス化設計入門 - AWS Dev Day Tokyo 2017
Ad

イベント・ソーシングを知る