SHOEISHA iD

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

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

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

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

Akkaの導入とアンチパターン、そしてクラウドネイティブへの対応

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

Akka導入のアンチパターン

 先駆者たちの苦労もあって、Akkaの導入に失敗する典型的なアンチパターンは、少しずつ知られてきていています。大まかに言うと、Akka導入が失敗するのは、

  • リアクティブ宣言が対象とするアプリケーション以外に導入する
  • Akkaの特徴を生かした設計になっていない

という2点に集約されます。この指針にそってアンチパターンとなる例をいくつか見てみましょう。

リアクティブ宣言で挙げられている水準を必要としないアプリケーション

 まずリアクティブ宣言で挙げられている水準の即応性 、耐障害性 、弾力性を必要としないアプリケーションであればAkkaを導入しなくてよいでしょう。

 即応性というほどではなく、何度かリクエストを投げるうちに、たまにレスポンスが早く返ってくればいい、くらいの要求であれば単純なオンメモリ・キャッシュで十分です。ORMの中にはデータベースからのデータを自動でキャッシュしてくれるものもあります。

 障害時にダウンタイムが発生しても影響は軽微で、弾力性が要らずリクエストが増加したら一時的にシステム全体が動かなくなっても構わない、そういうシステムであればもっと簡単な技術で構成する方が低コストで運用できます。

Akkaのメリットが生かせないアプリケーション

 自分の作るアプリケーションが、リアクティブ宣言の対象となる水準の即応性 、耐障害性 、弾力性を必要とするものだとしましょう。その場合でもアクターの機能を存分に生かせなければ、Akkaを使う必要はありません。

 例えばデータ・ウェアハウスのような、時系列データをどんどん溜め込んで、後から分析を走らせるシステムを考えてみます。即座にクエリに応答せねばならず、障害に強く、データ量増大に合わせてマシン台数を増やせるデータ・ウェアハウスが求められていても、そこにアクターを生かせる余地は少ないでしょう。こういったシステムではアクターのもつような内部状態を排除して、クエリの柔軟さと効率に特化して作るべきです。

 アクターの最大のメリットの1つは、内部状態をもつ非同期・並行処理を安全に行えることです。そもそも内部状態が存在しないアプリケーションであれば、アクター以外の選択肢が適しています。「ハンマーしか持っていなければすべてが釘のように見える」ということわざは、アクターの導入失敗の1番多い例もよく表しています。本来内部状態が存在しない処理にアクターを用いることは、Akka初心者が最もよく犯す間違いです。これはシステムに無用な複雑さをもたらすだけで、何のメリットもありません。例えば、自分が作ったアクターの中に、メッセージを右から左へ受け流すだけのものが出て来たら要注意です。

内部状態である必要がない場合

 アクターを用いる前に、内部状態として表現されたものが、本当に内部状態である必要があるのかも検討してください。現代のアプリケーションは複雑さが増し、システムのさまざまな箇所に内部状態が存在します。それでも、内部状態は可能な限り排除すべきです。初歩的な関数型プログラミングのテクニックを使うのも有効でしょう。入力から完全に出力が予測できる処理を組み合わせ、それでも残った必要不可欠な内部状態に対してアクターを使うかどうか検討してください。

Akka実装のアンチパターン

 さらに、要求としてはアクターが適していても、実装が悪いためにアンチパターンになってしまうこともあります。アクターのもう1つの大きなメリットは、疎結合な設計が可能なことですが、実装が悪いとアクターとデータベースの密結合、あるいはアクター同士の密結合を引き起こします。

 アクターとデータベースの密結合に関しては、アクター内部のコードでデータベースへのクエリを組み立てていたり、データベースに対するプロキシのようにクエリを受けて結果を返すだけのアクターを置いたりしていたら要注意です。アクターを使うのをやめるか、イベント・ソーシングやCQRSパターンの導入を検討しましょう。

 一方、アクター同士の密結合は、第4回で紹介したシーケンス図で表される、メッセージの経路に症状が表れます。シーケンス図が異様に長くなったら黄色信号です。シーケンス図中の後続アクターで処理を開始するのに、必ず複数のアクターを経由しなくてはならない密結合になっています。

 アプリケーションに機能追加はつきものですが、シーケンスが長い場合は、途中で分岐しないと機能追加できないことがよくあります。複数のアクターで実現された一連の処理を分岐させるのは、通常のクラスのメソッド内の処理を分岐させるよりはるかに大変で、ソースコード変更の影響範囲も大きくなります。こういった兆候を感じたら、それぞれのアクターが本当に内部状態を必要とするか、アクター以外の実装で代替できないのか検討してください。あるいは一箇所にまとめるべき処理を、無理に複数のアクターに分割しているのかもしれません。

 Akka導入に際しての使いどころとアンチパターンを紹介し終わったところで、本連載の最後にAkkaとクラウドネイティブの動向について、お話しましょう。

次のページ
クラウドネイティブで拡がるAkkaの未来

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

Akkaで学ぶアクターモデル入門連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/14207 2021/06/17 11:00

イベント

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

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

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

メールバックナンバー