Slide 1

Slide 1 text

Spring BootとKafkaでCQRS Nov.18.2017 at JJUG CCC 2017 Fall Mitsuyuki Shiiba EC Incubation Development Department. Rakuten, Inc.

Slide 2

Slide 2 text

#ccc_e6 Mitsuyuki Shiiba(@bufferings) 関ジャバの⽅から来ました!!

Slide 3

Slide 3 text

#ccc_e6 Mitsuyuki Shiiba(@bufferings) 好き • Java、Scrum、DDD、娘

Slide 4

Slide 4 text

#ccc_e6 Mitsuyuki Shiiba(@bufferings) 仕事 • 楽天株式会社 ⼤阪⽀社(2010〜) • ウェブアプリケーションエンジニア • ECインキュベーション開発部 仲間募集中ですー!興味ある⽅は連絡くださいー! 「解決してあげることが改善ではない」20年のWeb開発から⽣ま れた、楽天式"カイゼン"とは。 https://teratail.com/report/3

Slide 5

Slide 5 text

#ccc_e6 CQRS? • 聞いたことある? • 知ってる? • 使ったことある? ほとんどの⼈がCQRSって聞いたことはあって、それが何かって ことを知ってる⼈は3割くらいいたけど、使ったことある⼈はほと んどいなかったね。

Slide 6

Slide 6 text

#ccc_e6 CQRS Command and Query Responsibility Segregation コマンドクエリ責務分離 named by Greg Young CQS原則(Bertrand Meyer)が起源になってます。 参照: Bliki(ja) “コマンド・問い合わせの分離” http://bliki-ja.github.io/CommandQuerySeparation/

Slide 7

Slide 7 text

#ccc_e6 CQRS コマンドとクエリを別のオブジェクトに分ける ってどういうこと?

Slide 8

Slide 8 text

#ccc_e6 CQRS コマンドとクエリを別のオブジェクトに分ける 図はCacooで書きました。すごく使いやすいー。 https://cacoo.com/ja

Slide 9

Slide 9 text

#ccc_e6 CustomerService void MakeCustomerPreferred(CustomerId) Customer GetCustomer(CustomerId) CustomerSet GetCustomersWithName(Name) CustomerSet GetPreferredCustomers() void ChangeCustomerLocale(CustomerId, NewLocale) void CreateCustomer(Customer) void EditCustomerDetails(CustomerDetails) 参照: CQRS, Task Based UIs, Event Sourcing agh! http://codebetter.com/gregyoung/2010/02/16/cqrs-task-based-uis- event-sourcing-agh/ (参照⽇ 2017-11-17)

Slide 10

Slide 10 text

#ccc_e6 CustomerWriteService void MakeCustomerPreferred(CustomerId) void ChangeCustomerLocale(CustomerId, NewLocale) void CreateCustomer(Customer) void EditCustomerDetails(CustomerDetails) 参照: CQRS, Task Based UIs, Event Sourcing agh! http://codebetter.com/gregyoung/2010/02/16/cqrs-task-based-uis- event-sourcing-agh/ (参照⽇ 2017-11-17)

Slide 11

Slide 11 text

#ccc_e6 CustomerReadService Customer GetCustomer(CustomerId) CustomerSet GetCustomersWithName(Name) CustomerSet GetPreferredCustomers() 参照: CQRS, Task Based UIs, Event Sourcing agh! http://codebetter.com/gregyoung/2010/02/16/cqrs-task-based-uis- event-sourcing-agh/ (参照⽇ 2017-11-17)

Slide 12

Slide 12 text

#ccc_e6 CQRS コマンドとクエリを別のオブジェクトに分ける

Slide 13

Slide 13 text

#ccc_e6 CQRS これだけ

Slide 14

Slide 14 text

#ccc_e6 CQRS なんだけど⾯⽩い! これをどうやって実現しようかな?って考え始めると、すごく⾯ ⽩いー。

Slide 15

Slide 15 text

#ccc_e6 今⽇のお話 • 第1話:僕とDDD • 第2話:僕とCQRS • 第3話:僕とDomain Event • 第4話:僕とEvent Sourcing • 第5話:僕とCQRS(その2) • 第6話:Spring BootとKafkaでCQRS

Slide 16

Slide 16 text

#ccc_e6 今⽇のお話 ⾯⽩そうだなと思って僕が勉強してることのお話 CQRSを仕事で実践したって話じゃないよ。

Slide 17

Slide 17 text

#ccc_e6 今⽇のお話のゴール CQRS⾯⽩そうだね!って 懇親会で話かけてもらえるように頑張る!

Slide 18

Slide 18 text

#ccc_e6 第1話:僕とDDD Domain Driven Design(ドメイン駆動設計)

Slide 19

Slide 19 text

#ccc_e6 僕 複雑になっていくシステムをなんとかしたい

Slide 20

Slide 20 text

#ccc_e6 僕 最初にキレイなシステムを作れたらOK?

Slide 21

Slide 21 text

#ccc_e6 僕 それでも、だんだん複雑になっていく感じする

Slide 22

Slide 22 text

#ccc_e6 僕 • 複雑じゃないんだったら、その状態をキープし たい! • 複雑なんだとしても、⽬を背けずにそれを改善 していきたい! ってことは…

Slide 23

Slide 23 text

#ccc_e6 僕 • 複雑さから逃げるんじゃなくて • 複雑さを避けるんじゃなくて • 複雑さに⽴ち向かわなきゃいけない どうしたらいいんだろう?

Slide 24

Slide 24 text

#ccc_e6 DDD 「ソフトウェアの核⼼にある 複雑さに⽴ち向かう」 エリック・エヴァンスのドメイン駆動設計(⽇本語訳:2011年) https://books.rakuten.co.jp/rb/11146351/

Slide 25

Slide 25 text

#ccc_e6 DDD 分からん!!! 10年前くらいに英語版(読めもしないのに!)買って最初のペー ジにある中国の地図だけ⾒てました!2011年に⽇本語版が出て読 んでみてもやっぱり分かりませんでした!

Slide 26

Slide 26 text

#ccc_e6 DDD 「エリック・エヴァンズが 確⽴した理論を実際の設計に 応⽤する」 実践ドメイン駆動設計(⽇本語訳: 2015年) https://books.rakuten.co.jp/rb/13138730/

Slide 27

Slide 27 text

#ccc_e6 DDD 少し分かってきたかも! それまでは「⾔ってることは分かるけど、どう実装したらいいん だろう?」っだったんだけど、この本で具体例を教えてくれてる ので「少し分かってきたかも!」ってなったんだった。2015年ま での間に、⾃分⾃⾝が⾊々⾒て成⻑してきたのもあるかな。

Slide 28

Slide 28 text

#ccc_e6 DDDが⼤切にしていることの⼀つに 依存関係を切り離すことで複雑さを閉じ込めて コントロールできるようにしている部分がある という印象

Slide 29

Slide 29 text

#ccc_e6 DDD: 境界づけられたコンテキスト コンテキストを切り離す

Slide 30

Slide 30 text

#ccc_e6 DDD: ドメインモデル DBやUIなどドメインロジックに関係ないことを 切り離す

Slide 31

Slide 31 text

#ccc_e6 DDD: 集約 他のモデルから切り離す (トランザクションの単位)

Slide 32

Slide 32 text

#ccc_e6 DDD 凝縮して⼩さく保つことで複雑さに⽴ち向かう 他にも⾊々あるけどね。今⽇関係するのはこのあたり。

Slide 33

Slide 33 text

#ccc_e6 僕とDDD よっしゃー!やってみるぞー!

Slide 34

Slide 34 text

#ccc_e6 僕とDDD DBからの解放感。素敵すぎる。 ドメインモデルからDBに関係するものを(アノテーションすら も)切り離したら解放感。リポジトリが頑張ってくれてる。

Slide 35

Slide 35 text

#ccc_e6 僕とDDD この調⼦でUIからも解放…あれ?ムズい…

Slide 36

Slide 36 text

#ccc_e6 僕とDDD この調⼦でUIからも解放…あれ?ムズい… • 複数の集約をつないだ情報が必要だったり • 集約から導出した値で検索が必要だったり

Slide 37

Slide 37 text

#ccc_e6 第1話:僕とDDD 完 ぐぬぬ。。。 ということで、実はJOIN使ったりしてた。

Slide 38

Slide 38 text

#ccc_e6 第2話:僕とCQRS

Slide 39

Slide 39 text

#ccc_e6 前回のあらすじ DDDで複雑さに⽴ち向かおうとしたが UI⽤の情報をいい感じに取得できなかった

Slide 40

Slide 40 text

#ccc_e6 僕とCQRS コマンド⽤とクエリ⽤でモデルを分ける

Slide 41

Slide 41 text

#ccc_e6 僕とCQRS 定義としてはこれ

Slide 42

Slide 42 text

#ccc_e6 僕とCQRS 今までこんな感じだったけど

Slide 43

Slide 43 text

#ccc_e6 僕とCQRS こうやってみると・・・あぁそうか

Slide 44

Slide 44 text

#ccc_e6 僕とCQRS ひとつのモデルにとらわれることなかったんだ! 分けて考えていいんだ!という気づき ⾔われてみれば「確かに!」なんだけど、⾔われるまで全然その 発想がなかったなぁ。

Slide 45

Slide 45 text

#ccc_e6 僕とCQRS DB分けても良いわけだし 分けなくてもいいんだよ。

Slide 46

Slide 46 text

#ccc_e6 僕とCQRS Query側にはDomain Modelを置かない という⼿もある

Slide 47

Slide 47 text

#ccc_e6 僕とCQRS ドメインモデルがクエリから解放された!!

Slide 48

Slide 48 text

#ccc_e6 僕とCQRS そしてRead側でSQLの⼒も存分に活かせる!!

Slide 49

Slide 49 text

#ccc_e6 第2話:僕とCQRS 完

Slide 50

Slide 50 text

#ccc_e6 第3話:僕とDomain Event

Slide 51

Slide 51 text

#ccc_e6 僕とDomain Event ところで、コンテキストや集約を切り離したら これまでトランザクションでつないでた情報を どうやって伝えよう? いや、僕は実は複数の集約をトランザクションで囲ってたりする

Slide 52

Slide 52 text

#ccc_e6 僕とDomain Event ドメインイベントで集約やコンテキストをつなぐ

Slide 53

Slide 53 text

#ccc_e6 Domain Event? 「何かが実際に起こった」という事実をモデル化

Slide 54

Slide 54 text

#ccc_e6 Domain Event 「何かが実際に起こった」という事実をモデル化 • CoffeeOrdered • CoffeeBrewed • CoffeeDelivered

Slide 55

Slide 55 text

#ccc_e6 僕とDomain Event 発⽣したイベントを受け取って情報を更新

Slide 56

Slide 56 text

#ccc_e6 僕とDomain Event 確かに現実に合ってるなぁ これならコーヒーショップの店員さんと システムの話ができそう

Slide 57

Slide 57 text

#ccc_e6 僕とDomain Event ドメインイベント使うの良さそう! 使ってみたい!←イマココ

Slide 58

Slide 58 text

#ccc_e6 第3話:僕とDomain Event 完

Slide 59

Slide 59 text

#ccc_e6 第4話:僕とEvent Sourcing

Slide 60

Slide 60 text

#ccc_e6 僕とEvent Sourcing ん?ドメインイベントを使って もう⼀歩踏み込んだパターンがあるのか? イベントソーシング?⾒てみよう!

Slide 61

Slide 61 text

#ccc_e6 僕とEvent Sourcing 状態⾃体を書き換えるのはステートソーシング 今やってるやり⽅

Slide 62

Slide 62 text

#ccc_e6 僕とEvent Sourcing それに対して 「イベントの積み重ねによって今の状態がある」 という考え⽅がイベントソーシング 残り3⽸あるね

Slide 63

Slide 63 text

#ccc_e6 僕とEvent Sourcing • どんな変更をしてきたのかが分かる • リプレイもできる 昨⽇は5⽸残ってたね

Slide 64

Slide 64 text

#ccc_e6 僕とEvent Sourcing • クエリ困る 残りの本数が多い順に並 べたいな・・・

Slide 65

Slide 65 text

#ccc_e6 僕とEvent Sourcing w/ CQRS CQRSを適⽤して、クエリのモデルを分ける

Slide 66

Slide 66 text

#ccc_e6 A Decade of DDD, CQRS, Event Sourcing Greg Young@DDDEU 2016 https://youtu.be/LDW0QWie21s Picture: https://flic.kr/p/DLfn5i (CC BY-NC-SA 2.0 https://creativecommons.org/licenses/by-nc-sa/2.0/ )

Slide 67

Slide 67 text

#ccc_e6 A Decade of DDD, CQRS, Event Sourcing こういうことを⾔ってたりする • CQRSはEvent SourcingへのStepping-Stone • CQRS/Event Sourcingを全体に適⽤しない • ⾊んな実現⽅法があって良い ESは考え⽅が全然違うから⼀気にそこまでジャンプするの難しい。 だから、CQRSを踏み台にして進むと良い。って感じのことを ⾔ってた。喋るのはやくて何度も聞き直したー。

Slide 68

Slide 68 text

#ccc_e6 CQRSとEvent Sourcingはセットなの?

Slide 69

Slide 69 text

#ccc_e6 CQRSとEvent Sourcingはセットなの? 「CQRSとEvent Sourcingは 別々のパターンだけど共⽣関係にある」 というのがGreg Youngの考え 参照: CQRS and Event Sourcing http://codebetter.com/gregyoung/2010/02/13/cqrs-and-event- sourcing/ (参照⽇ 2017-11-17)

Slide 70

Slide 70 text

#ccc_e6 CQRSとEvent Sourcingはセットなの? CQRSのおかげで Event Sourcingは良い感じになる • さっき⾒たね 参照: CQRS and Event Sourcing http://codebetter.com/gregyoung/2010/02/13/cqrs-and-event- sourcing/ (参照⽇ 2017-11-17)

Slide 71

Slide 71 text

#ccc_e6 CQRSとEvent Sourcingはセットなの? Event Sourcingのおかげで CQRSも良い感じになる • 2PC(2 Phase Commit)が不要 • 何が変更されたのかが分かる 参照: CQRS and Event Sourcing http://codebetter.com/gregyoung/2010/02/13/cqrs-and-event- sourcing/ (参照⽇ 2017-11-17)

Slide 72

Slide 72 text

#ccc_e6 どゆこと? さっき考えたCQRSはこんな感じ

Slide 73

Slide 73 text

#ccc_e6 どゆこと? ドメインイベントを使うとこうなる

Slide 74

Slide 74 text

#ccc_e6 どゆこと? この場合2PCを考える必要があるのと

Slide 75

Slide 75 text

#ccc_e6 どゆこと? 変更差分を考える必要がある

Slide 76

Slide 76 text

#ccc_e6 CQRSとEvent Sourcingはセットなの? なるほどね。だから CQRSにはEvent Sourcingが良く合うってことね 発⽣したイベントをストアに登録するだけだから2PC不要だし、 そのイベント⾃体が差分を表してくれてるからね。

Slide 77

Slide 77 text

#ccc_e6 僕とEvent Sourcing ⾔ってることは分かる 分かるんだけど、まだ僕には早いかな

Slide 78

Slide 78 text

#ccc_e6 第4話:僕とEvent Sourcing 完

Slide 79

Slide 79 text

#ccc_e6 第5話:僕とCQRS(その2) ということで、もう⼀度今の⾃分の⽴ち位置を考えてみる

Slide 80

Slide 80 text

#ccc_e6 僕とCQRS CQRSでクエリモデルを分離したんよね

Slide 81

Slide 81 text

#ccc_e6 僕とCQRS よく考えたら、これに近いことを、 DDDをやる前からやってる気もするな・・・

Slide 82

Slide 82 text

#ccc_e6 僕とCQRS よく考えたら、これに近いことを、 DDDをやる前からやってる気もするな・・・ • クエリ⽤のDBを⽤意したり • レポート⽤のテーブルを使ったり • サーチは別のシステムで作ったり

Slide 83

Slide 83 text

#ccc_e6 僕とCQRS トリガーは様々 • DBに保存するときに頑張ってたり • 定期実⾏のバッチだったり • APIを呼び出してたり

Slide 84

Slide 84 text

#ccc_e6 僕とCQRS それもいいね 新しいやり⽅が出てきたからって、これまでのやり⽅を否定する 必要はないと思うってことを伝えたくて。

Slide 85

Slide 85 text

#ccc_e6 僕とCQRS ま、それは置いといてさっき少し出てきたけど やっぱりドメインイベント駆動型って興味ある

Slide 86

Slide 86 text

#ccc_e6 僕とCQRS こんな感じにできたら今の僕にちょうど良いかな

Slide 87

Slide 87 text

#ccc_e6 第5話:僕とCQRS(その2) 完

Slide 88

Slide 88 text

#ccc_e6 第6話: CQRSとKafkaとSpring Boot

Slide 89

Slide 89 text

#ccc_e6 CQRSとKafkaとSpring Boot これをやりたい

Slide 90

Slide 90 text

#ccc_e6 Messaging System イベントをハンドリングするための メッセージングシステムが必要

Slide 91

Slide 91 text

#ccc_e6 Apache Kafka https://kafka.apache.org/

Slide 92

Slide 92 text

#ccc_e6 Apache Kafka 分散ストリーミングプラットフォーム https://kafka.apache.org/intro

Slide 93

Slide 93 text

#ccc_e6 Apache Kafka 仕組み https://kafka.apache.org/intro

Slide 94

Slide 94 text

#ccc_e6 Apache Kafka 仕組み https://kafka.apache.org/intro

Slide 95

Slide 95 text

#ccc_e6 Spring Boot + Kafka Demo Project https://github.com/bufferings/jjug2017

Slide 96

Slide 96 text

#ccc_e6 Demo1: Kafka Java Client KafkaのJavaクライアントを使⽤して Producer/Consumerを使ってみる (Spring Boot関係ないです) Special Thanks: Apache KafkaのQuickstartのサンプルを、JavaのClient APIで書き 直してみた – CLOVER http://d.hatena.ne.jp/Kazuhira/20170306/1488814266

Slide 97

Slide 97 text

#ccc_e6 Demo2: Spring Boot + Kafka Spring BootとSpring Kafkaを使⽤して Producer/Consumerを使ってみる

Slide 98

Slide 98 text

#ccc_e6 Demo3: Spring BootとKafkaでCQRS Command/Processor/QueryでCQRS的に動かして みる

Slide 99

Slide 99 text

#ccc_e6 第6話: CQRSとKafkaとSpring Boot 完

Slide 100

Slide 100 text

#ccc_e6 まとめ

Slide 101

Slide 101 text

#ccc_e6 まとめ • 第1話:僕とDDD • 第2話:僕とCQRS • 第3話:僕とDomain Event • 第4話:僕とEvent Sourcing • 第5話:僕とCQRS(その2) • 第6話:Spring BootとKafkaでCQRS

Slide 102

Slide 102 text

#ccc_e6 まとめ 今の僕の状況 これを実現させるための勉強をしていこうと思ってる。

Slide 103

Slide 103 text

#ccc_e6 注意点 全てをCQRSにしない • CQRSやESは複雑さを持ち込んでしまう • CRUDは⾊んなことをシンプルにしてくれる • 本当に必要で有効な場所だけに使うといい そのために⾊々と⼩さく切り離しておくのが役に⽴つね。

Slide 104

Slide 104 text

#ccc_e6 この後やってみたいこと • Functional Programming • Reactive Programming • Event Sourcing • Kafka Streams • Kafka Connect

Slide 105

Slide 105 text

#ccc_e6 この後やってみたいこと • Functional Programming • Reactive Programming • Event Sourcing • Kafka Streams • Kafka Connect の中のどれか1個 他のは勉強会とかに聞きに⾏きますので誰か教えて!!

Slide 106

Slide 106 text

#ccc_e6 最後に 以上が、僕の試⾏錯誤のお話でした。

Slide 107

Slide 107 text

#ccc_e6 最後に 何かもし「いいな」って思うことがあったなら ご褒美に、あなたのお話を聞かせてください!

Slide 108

Slide 108 text

#ccc_e6 最後に 懇親会でもいいし、ツイッターでもいいし、 次のJJUG CCCで発表してくれるのでも いいと思います! ありがとうございました!

Slide 109

Slide 109 text

#ccc_e6 Reference CQRS, Task Based UIs, Event Sourcing agh! • http://codebetter.com/gregyoung/2010/02/16/cqrs-task-based-uis-event-sourcing-agh/ CQRS and Event Sourcing • http://codebetter.com/gregyoung/2010/02/13/cqrs-and-event-sourcing/ Bliki: CQRS • https://martinfowler.com/bliki/CQRS.html Bliki: ReportingDatabase • https://martinfowler.com/bliki/ReportingDatabase.html CQRS Documents by Greg Young • https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf

Slide 110

Slide 110 text

#ccc_e6 Reference Greg Young — A Decade of DDD, CQRS, Event Sourcing • https://youtu.be/LDW0QWie21s CQRSに取り組むべき時期、理由、⽅法(Sebastian Daschner) • https://youtu.be/ajASbq5pzss エリック・エヴァンスのドメイン駆動設計 • https://books.rakuten.co.jp/rb/11146351/ 実践ドメイン駆動設計 • https://books.rakuten.co.jp/rb/13138730/ 現場で役⽴つシステム設計の原則 • https://books.rakuten.co.jp/rb/15017530/

Slide 111

Slide 111 text

#ccc_e6 Reference Apache Kafka • https://kafka.apache.org/ Apache Kafkaに⼊⾨した | SOTA • http://deeeet.com/writing/2015/09/01/apache-kafka/ Event sourcing, CQRS, stream processing and Apache Kafka: What’s the connection? • https://www.confluent.io/blog/event-sourcing-cqrs-stream-processing-apache-kafka-whats- connection/ Building a Microservices Ecosystem with Kafka Streams and KSQL • https://www.confluent.io/blog/building-a-microservices-ecosystem-with-kafka-streams-and- ksql/ Building Event-driven Microservices Using CQRS and Serverless • http://www.kennybastani.com/2017/01/building-event-driven-microservices.html

Slide 112

Slide 112 text

#ccc_e6 Reference Apache KafkaのQuickstartのサンプルを、JavaのClient APIで書き直してみた - CLOVER • http://d.hatena.ne.jp/Kazuhira/20170306/1488814266 Cacoo • https://cacoo.com/ja

Slide 113

Slide 113 text

No content