SlideShare uma empresa Scribd logo
1 de 33
イベント・ソーシングを知る

 より価値の高いソフトウェア開発
      のために
なんのはなし?
• ソフトウェアの設計的な話
• ソフトウェアの情報をどのように永続化
  して扱うか(ソーシング, 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 とメッセージング 【きっと、良い
  パターン】

Mais conteúdo relacionado

Mais procurados

それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)NTT DATA Technology & Innovation
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Masahito Zembutsu
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門増田 亨
 
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース増田 亨
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
地理分散DBについて
地理分散DBについて地理分散DBについて
地理分散DBについてKumazaki Hiroki
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 

Mais procurados (20)

それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
地理分散DBについて
地理分散DBについて地理分散DBについて
地理分散DBについて
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 

Destaque

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

Destaque (14)

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

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