SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Akkaで学ぶアクターモデル入門

アクターモデルによる、APIやデータベースに振り回されないアプリケーション設計と実装

Akkaで学ぶアクターモデル入門 第4回

Web APIとアクターの接続

 アクターはメッセージを受け取ってから処理を開始するので、基本的に自分から処理を開始しません。処理の起点は多くの場合Web APIなどアクターの外部からの入力か、Akkaのスケジューラーが時間経過によって発生させるメッセージです。

 Web APIはクライアントからHTTPリクエストを受け取るので、それをメッセージ型に変換してアクターに送ります。アクターからメッセージが戻ってきたら、今度はそれをHTTPレスポンスに変換してクライアントに返します。

 Web API自体はアクターではないので、そのままではアクターからのメッセージを受け取ることができません。そこでAskパターンを用いると便利です。先程紹介した本記事のソースコードを載せたGitHubレポジトリでも、Mainクラス内でAskパターンを用いています。

さらなる要件の追加と設計

 ここまでアクターモデルによる設計をソースコードに落とし込む流れを説明しました。現実のチケット販売アプリケーションはもっと複雑ですし、また時間の経過とともに追加要件が出てくることでしょう。要件が複雑になったとしても、状態遷移図、シーケンス図、樹形図を始めとした設計をしっかり行うことによって対応しやすくなります。

 例として、チケットのキャンセル処理を考えましょう。チケット在庫アクターやチケット購入者アクターが受け取るメッセージの型として、キャンセルを示すものが加わり、売り切れ状態でキャンセルされると販売中状態に復帰するなど状態遷移図にも影響が出ます。

 あるいは別の要件としてチケットを組み合わせて買うことを可能にする場合、不正な組み合わせの購入リクエストを拒否する必要があるかもしれません。その場合はチケット在庫管理アクターではなく、親子関係の中でひとつ上のレベルのイベントアクターがチケット購入リクエストの処理を担うべきでしょう。これは設計上非常に大きな変更であり、ソースコードを書く前にしっかりと設計を行うことで、こういった変更の影響度を早い段階で検討できます。

まとめ

 アクターモデルが有効なアプリケーションの例としてオンラインチケット販売アプリケーションを紹介しました。適切な設計を行えばソースコードに落とし込みやすいAkkaは、言い換えれば正しい設計を促してくれます。シーケンス図、状態遷移図、樹形図などを使って、アクターモデルらしい設計を行いましょう。

 歴史的にWeb APIとデータベースにはしっかりとした設計指針がありました。Web APIではRESTが広く知られており、近年ではgRPCやGraphQLなどのツールが普及したことで、よりAPIを設計しやすい環境が整ってきました。データベースも、最も広く用いられるリレーショナルデータベースにおいては、正規化やリレーショナル代数にもとづく理論があります。しかし、Web API層とデータベース層をつなぐアプリケーション層においては、Web API層やデータベース層の都合に引っ張られる形で設計されるケースが多かったのではないでしょうか? アクターモデルが有効に使える領域では、それがしっかりとした設計指針となります。Web API層とデータベース層、アプリケーション層それぞれで適切な設計を行えば、長期にわたって保守しやすく、実装に移ったときの手戻りが少ないアプリケーションができるでしょう。

 次回の記事ではイベント・ソーシングとCQRSパターンを紹介します。アクターモデルとデータベースを接続する際にはメリットが多数あるパターンで、これらのサポートはAkkaの特徴的な機能でもあるので、記事一本を使ってしっかり紹介いたします。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Akkaで学ぶアクターモデル入門連載記事一覧

もっと読む

この記事の著者

リチャード 伊真岡(リチャード イマオカ)

 大学卒業後、9年間証券会社にてプログラマ兼技術サポートとして勤務。その後いくつかの企業でバックエンド・エンジニアや技術広報などを務める。  プライベートでは過去にScala/JavaのOSSであるakkaへ貢献。 Twitter:@RichardImaokaJP

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/12642 2020/08/05 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー