JavaによるAkkaトレーニング第3回
アクターとデータベースのシステム(イベント・ソーシング)
Akkaは状態を持つ非同期処理を実装するだけでなく、耐障害性をもったシステムを構築するのに有用なツールキットです。 トレーニングの第2回ではアクターを用いたアプリケーションの作成方法を学びました。 今回はAkkaアクターを用いたアプリケーションとデータベースを接続する方法について学びます。
- 第1回のトレーニング: リレーショナル・データベースのトランザクションによる排他制御
- 第2回のトレーニング: アクターによる非同期処理
- 第3回のトレーニング: アクターとデータベースのシステム(イベント・ソーシング)
- 第4回のトレーニング: アクターとデータベースのシステム(CQRS)
- 第5回のトレーニング: クラスタリング
課題
この課題をこなすことがトレーニングのゴールです。 独力でも手を動かしながら進められるようようになっていますが、可能ならトレーナーと対話しながらすすめることでより効果的に学べます。
この課題で身につく能力
- 状態遷移図とEventSourceBehaviorの対応関係がわかる
- akka-persistence-jdbcとSerializerの動作がわかる、設定ができる
- パフォーマンスを計測
事前準備:
MacBook前提。
- MySQL8.0.19をローカル開発環境にインストールしてください
brew update
brew install mysql@8.0.19
mysql.Sever stop
//もし自分の環境で別のバージョンのMySQLが走っていたら/usr/local/opt/mysql@8.0/bin/mysql.Sever start
- Mavenをインストールしてください
brew install maven
作業開始:
- このレポジトリをgit cloneしてください
git clone git@github.com:mvrck-inc/training-akka-java-3-persistence.git
- データベースのセットアップをしてください (setup.sql) - 参考: akka-persistence-jdbcプラグインのデフォルト・テーブル構成(リンク)
- アプリケーションを走らせてください
mvn compile
mvn exec:java -Dexec.mainClass=org.mvrck.training.app.Main
- curlでデータを挿入してください
curl -X POST -H "Content-Type: application/json" -d "{\"ticket_id\": 1, \"user_id\": 2, \"quantity\": 1}" http://localhost:8080/orders
- クライアント側ログからレスポンスを確認してください
- データベースでjournalテーブルを確認してください (select.sql)
- wrkでベンチマークを走らせてください
wrk -t2 -c4 -d5s -s wrk-scripts/order.lua http://localhost:8080/orders
-t2
: 2 threads-c4
: 4 http connections-d5
: 5 seconds of test durationwrk-scripts/order.lua
(リンク)- クライアント側の実行結果を確認してください
- データベースでjournalテーブルを確認してください (select.sql)
- アプリケーション再起動後にcurlでGETしてアクターの内部状態が復元されていることを確認してください
curl http://localhost:8080/orders/00fcca39-e162-4c3b-a171-613028772a24
- orders以下のUUID部分はデータベースのテーブルから探して適当なものに置き換えてください
- akka-persistenceのセットアップを確認してください
- application.conf - 参考 akka-persistence-jdbcプラグインのデフォルト設定(リンク)
- pom.xml
- jacksonによるSerializationをセットアップを確認してください
- TicketStockActorとOrderActorの整合性を保つシーケンス図を確認してください - (参考リンク: PlantUML)
- TicketStockActor
- OrderActor
- ガーディアンアクター以下親子関係のから樹形図を確認してください (リンク)
発展的内容:
- 状態遷移図で売り切れ後のチケット追加販売を考えてください
- 状態遷移図でオーダーのキャンセルを考慮してください
- 状態遷移図でイベントの中止、払い戻しを考えてください
- 状態遷移図で先着と抽選の2通りを考えてください
- 状態遷移図で複数チケットの同時購入を考えてください
- 不正データのハンドリング、業務例外を考えてください
- 不正なオーダーを弾いてください(年齢制限、不正なチケット種別の組み合わせ、などなど)
- 購入履歴と照らし合わせた不正な購入を防いでください
- asyncテストが必要となるテストケース例を考えてINSTRUCTIONください
- コンサート以外に、スポーツや映画、入場券のみイベントを実現するテーブルを考えてください