Akka導入のアンチパターン
先駆者たちの苦労もあって、Akkaの導入に失敗する典型的なアンチパターンは、少しずつ知られてきていています。大まかに言うと、Akka導入が失敗するのは、
- リアクティブ宣言が対象とするアプリケーション以外に導入する
- Akkaの特徴を生かした設計になっていない
という2点に集約されます。この指針にそってアンチパターンとなる例をいくつか見てみましょう。
リアクティブ宣言で挙げられている水準を必要としないアプリケーション
まずリアクティブ宣言で挙げられている水準の即応性 、耐障害性 、弾力性を必要としないアプリケーションであればAkkaを導入しなくてよいでしょう。
即応性というほどではなく、何度かリクエストを投げるうちに、たまにレスポンスが早く返ってくればいい、くらいの要求であれば単純なオンメモリ・キャッシュで十分です。ORMの中にはデータベースからのデータを自動でキャッシュしてくれるものもあります。
障害時にダウンタイムが発生しても影響は軽微で、弾力性が要らずリクエストが増加したら一時的にシステム全体が動かなくなっても構わない、そういうシステムであればもっと簡単な技術で構成する方が低コストで運用できます。
Akkaのメリットが生かせないアプリケーション
自分の作るアプリケーションが、リアクティブ宣言の対象となる水準の即応性 、耐障害性 、弾力性を必要とするものだとしましょう。その場合でもアクターの機能を存分に生かせなければ、Akkaを使う必要はありません。
例えばデータ・ウェアハウスのような、時系列データをどんどん溜め込んで、後から分析を走らせるシステムを考えてみます。即座にクエリに応答せねばならず、障害に強く、データ量増大に合わせてマシン台数を増やせるデータ・ウェアハウスが求められていても、そこにアクターを生かせる余地は少ないでしょう。こういったシステムではアクターのもつような内部状態を排除して、クエリの柔軟さと効率に特化して作るべきです。
アクターの最大のメリットの1つは、内部状態をもつ非同期・並行処理を安全に行えることです。そもそも内部状態が存在しないアプリケーションであれば、アクター以外の選択肢が適しています。「ハンマーしか持っていなければすべてが釘のように見える」ということわざは、アクターの導入失敗の1番多い例もよく表しています。本来内部状態が存在しない処理にアクターを用いることは、Akka初心者が最もよく犯す間違いです。これはシステムに無用な複雑さをもたらすだけで、何のメリットもありません。例えば、自分が作ったアクターの中に、メッセージを右から左へ受け流すだけのものが出て来たら要注意です。
内部状態である必要がない場合
アクターを用いる前に、内部状態として表現されたものが、本当に内部状態である必要があるのかも検討してください。現代のアプリケーションは複雑さが増し、システムのさまざまな箇所に内部状態が存在します。それでも、内部状態は可能な限り排除すべきです。初歩的な関数型プログラミングのテクニックを使うのも有効でしょう。入力から完全に出力が予測できる処理を組み合わせ、それでも残った必要不可欠な内部状態に対してアクターを使うかどうか検討してください。
Akka実装のアンチパターン
さらに、要求としてはアクターが適していても、実装が悪いためにアンチパターンになってしまうこともあります。アクターのもう1つの大きなメリットは、疎結合な設計が可能なことですが、実装が悪いとアクターとデータベースの密結合、あるいはアクター同士の密結合を引き起こします。
アクターとデータベースの密結合に関しては、アクター内部のコードでデータベースへのクエリを組み立てていたり、データベースに対するプロキシのようにクエリを受けて結果を返すだけのアクターを置いたりしていたら要注意です。アクターを使うのをやめるか、イベント・ソーシングやCQRSパターンの導入を検討しましょう。
一方、アクター同士の密結合は、第4回で紹介したシーケンス図で表される、メッセージの経路に症状が表れます。シーケンス図が異様に長くなったら黄色信号です。シーケンス図中の後続アクターで処理を開始するのに、必ず複数のアクターを経由しなくてはならない密結合になっています。
アプリケーションに機能追加はつきものですが、シーケンスが長い場合は、途中で分岐しないと機能追加できないことがよくあります。複数のアクターで実現された一連の処理を分岐させるのは、通常のクラスのメソッド内の処理を分岐させるよりはるかに大変で、ソースコード変更の影響範囲も大きくなります。こういった兆候を感じたら、それぞれのアクターが本当に内部状態を必要とするか、アクター以外の実装で代替できないのか検討してください。あるいは一箇所にまとめるべき処理を、無理に複数のアクターに分割しているのかもしれません。
Akka導入に際しての使いどころとアンチパターンを紹介し終わったところで、本連載の最後にAkkaとクラウドネイティブの動向について、お話しましょう。
