JavaによるAkkaトレーニング第2回
アクターによる非同期処理
Akkaは非同期処理を実装するのに有用なツールキットです。 今回はAkkaのアクターを使った非同期処理を紹介し、3層アーキテクチャで用いたデータベース・トランザクションによる排他制御との違いを学びます。
- 第1回のトレーニング: リレーショナル・データベースのトランザクションによる排他制御
- 第2回のトレーニング: アクターによる非同期処理
- 第3回のトレーニング: アクターとデータベースのシステム(イベント・ソーシング)
- 第4回のトレーニング: アクターとデータベースのシステム(CQRS)
- 第5回のトレーニング: クラスタリング
課題
この課題をこなすことがトレーニングのゴールです。 独力でも手を動かしながら進められるようようになっていますが、可能ならトレーナーと対話しながらすすめることでより効果的に学べます。
この課題で身につく能力
- akkaのアクターを使って素早くアプリケーションの原型を作成できる
- 状態遷移図をもとにアクターの実装をソースコードに書き起こせる
事前準備:
MacBook前提。
- Mavenをインストールしてください
brew install maven
- Mavenに関してはMave 3.x系であれば動くのではないかと思います。
作業開始:
MacBook前提。
- このレポジトリをgit cloneしてください
git clone git@github.com:mvrck-inc/training-akka-java-2-actor.git
この課題はgit clone下ソースコードをそのまま使うことで、自分で新たにソースコードを書くことなく実行できるようになっています。 もちろん、自分で書き方を覚えたい方や、最後の発展的内容に取り組みたい方はご自分でぜひソースコードを書いてみてください。
- アプリケーションを走らせてください
mvn compile
mvn exec:java -Dexec.mainClass=org.mvrck.training.app.Main
- curlでデータをPOSTしてください
curl -X POST -H "Content-Type: application/json" -d "{\"ticket_id\": 1, \"user_id\": 2, \"quantity\": 1}" http://localhost:8080/orders
- クライアント側ログからレスポンスを確認してください
- 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
(リンク)- クライアント側とサーバー側の実行結果を確認してください
- TicketStockActorとOrderActorの整合性を保つシーケンス図を確認してください - (参考リンク: PlantUML)
- TicketStockActorの状態遷移図を確認してください - (参考リンク: PlantUML)
- OrderActorの状態遷移図を確認してください - (参考リンク: PlantUML)
- 詳細な状態遷移図を見てメッセージ、遷移可能状態、副作用を確認してください(リンク1) (リンク2)(リンク3)
- ソースコードのコマンドを[確認してください]
- 状態遷移「表」を確認してください
- ソースコードの状態の定義を[確認してください]
- ガーディアンアクター以下親子関係のから樹形図を確認してください (リンク)
- 各アクターの実装を確認してください
発展的内容:
- 状態遷移図で売り切れ後のチケット追加販売を考えてください
- 状態遷移図でオーダーのキャンセルを考慮してください
- 状態遷移図でイベントの中止、払い戻しを考えてください
- 状態遷移図で先着と抽選の2通りを考えてください
- 状態遷移図で複数チケットの同時購入を考えてください
- 不正データのハンドリング、業務例外を考えてください
- 不正なオーダーを弾いてください(年齢制限、不正なチケット種別の組み合わせ、などなど)
- 購入履歴と照らし合わせた不正な購入を防いでください
- asyncテストが必要となるテストケース例を考えてください
- コンサート以外に、スポーツや映画、入場券のみイベントを実現するテーブルを考えてください