Akkaチームのメンバーと翻訳者からメッセージが到着!
12月13日(水)に発売となった『Akka実践バイブル アクターモデルによる並行・分散システムの実現』は、分散・並行アプリケーションの構築をサポートするAkkaの教科書『Akka in Action』の邦訳版です。
今回、AkkaチームのメンバーであるKonrad Malawskiさんと、翻訳者の前出祐吾さん、根来和輝さん、釘屋二郎さんに発売を記念してメールインタビューをお願いしました。
Akkaについて、そしてAkkaが開発やビジネスにもたらすインパクトについてたっぷりとコメントをいただいたので、アプリケーションのトラフィックや並行・分散処理について課題を抱えている方は、ぜひ参考にしてみてください。
なぜAkkaが必要なのか?
Konrad Malawskiさん
Akkaは並行・分散システムを構築するためのツールキットです。様々な専門ライブラリの集まりであり、並行・分散システムを構築するのに役立ちます。Akkaのように安定かつ成熟したツールキットを使わずに、並行化あるいは分散化した大規模なリアクティブシステムのコードを書いて保守していくことは不可能でしょう。
Akkaはほかの非同期ライブラリが提供していないようなアプリケーションの分析に役立つ道具も提供しています。JVMのネイティブスレッドライブラリを直接使うよりも簡単に調整・理解できるトレースのようなテクニックや進んだメトリクスを使って分析を行います。
Akkaが目指すのは、単に並行・分散化したリアクティブシステムの構築を可能にするだけではなく、そういったシステムを簡潔にし、システムを構築するチームが小さくても、あるいは非常に大きくても保守しやすくするということです。
根来和輝さん
近年、ハードウェアの性能向上が鈍化していると言われています。一方で人々の生活やビジネスの領域でITに対する需要は年々増加しています。
これからのシステムは、限りあるハードウェアリソースの中でいかに効率よく処理できるか、需要に対してリソースが不足したときにスケールアウトできるか、ということが問われるようになるでしょう。Akkaはこのような要求に応えるためのライブラリを集めたツールキットです。
釘屋二郎さん
Akkaはアクターベースのコンポーネントによる並行・分散アプリケーションの構築をサポートするためのライブラリです。スケーラビリティが重要な要件となるWebシステムにおいて、その機能をスクラッチで構築するのは大変です。スーパーバイザーによる監督という機能や、akka-streamによる背圧制御と言った機能がこのような要件を満たすのを手助けしてくれます。
Akkaがもたらすインパクトやメリット
Konrad Malawskiさん
Akkaの強みはリアクティブ宣言に書かれていることでうまく説明できます。
リアクティブ宣言では、リアクティブシステムの特性を定義しています。たとえば、回復性(システムに致命的な障害が発生したりダウンタイムが発生したりしないようにする)、即応性(ユーザーのトラフィックに対して素早く反応する)、弾力性(サービスをサーバーやコアの増減によってスケールアップしたりスケールダウンする)です。
これらの特性を必要とするビジネスにAkkaは適しています。顧客を長い「待ち行列」に待たせることなくチケットを販売したり、「ブラックフライデー」や「独身の日」のような大規模なプロモーションイベントによってサイトがダウンしないようにしたり、といったように、企業がトラフィックを捌くのをうまく手助けします。
事例として、PayPalのような大手金融企業やCapital Oneのような伝統的な銀行でも、リアクティブシステムの構築にAkkaを利用することで大規模システムのモダナイゼーション(最新化)を行っています。
他分野の例としては、EC、医療、さらには30メートル望遠鏡(地球最大の望遠鏡)などがあります。こういった顧客の成功事例はReactive Summitというカンファレンスの動画で確認できます。
前出祐吾さん
Akkaのスケーラビリティと回復力を活かし、安定したレスポンスを返し続けるサービスを構築することは、ビジネスそのものの成長を支えます。
サービスのレスポンスが不安定であれば徐々にユーザーは離れていき、事業の継続が難しくなるかもしれません。Akkaを利用してスケールアップ/スケールアウトを行うことで、トラフィックが増加したときのレスポンスを安定させることができます。あるいは、長い年月をかけて蓄積したユーザーからの信頼を一度の致命的なサービスダウンで失ってしまうかもしれません。Akkaを利用すれば、部分的な障害はできるだけ小さい範囲に留めてサービス全体はダウンさせずに済みます。
もちろん、サービスのアイデアや機能そのものに魅力があることは大前提になりますが、前述のようなことをAkkaがサポートしてくれることで、エンジニアはビジネスに直結する機能の開発や改善に集中できることになるでしょう。
これらの恩恵を最も受けやすいのがクラウド環境です。サービス事業者が提供するサービスだけではなく、弊社が得意とするエンタープライズの世界でもコスト削減やデリバリスピードアップを目的に、オンプレミスからクラウドへとシフトしつつあります。
しかし、シフトが難しいものもあります。その一つが高可用性かつ低レイテンシを魔法のようなハードウェアの力で実現しているシステムです。ソフトウェアエンジニアからすれば、まさにフリーランチの世界ですが、この状況は決して長くは続かないと思います。そのハードウェアにすがりついているだけではクラウド時代の競争に勝ち抜くことは難しいでしょう。
これを打破するには、プラットフォームを選ばない高可用性と低レイテンシを両立するアプリケーションが必要です。実現できれば、ビジネスへのインパクトは計り知れません。
コストは大幅に削減し、素早く環境を構築できることで検証のハードルも下がりビジネスは加速します。特殊なハードウェア環境によってレガシーな技術に縛られることもなくなるでしょう。Akkaがその一翼を担うことを期待しています。
釘屋二郎さん
一定以上の負荷に耐える必要があるWebシステムの構築を行ったことがある方ならわかると思いますが、スケーラビリティについて何の設計も行わず、あとからシステムにそれを付け加えていくのは大変な労力が必要です。
キャッシュシステムを入れて高速化してみたり、データ構造をリファクタリングしてデータベースをNoSQLに入れ替えたりといった継ぎ接ぎの対応を行う必要があります。
Akkaはプロジェクトに導入するだけでスケーラビリティを得られるという「フレームワーク」ではありませんが、背景となっている設計思想を併せて学ぶことで、そうしたコストを幾分か削減してくれると思います。
ITエンジニアにとってのAkka
前出祐吾さん
私自身、過去に社内フレームワークの開発や拡張を行ってきましたが、1人のエンジニアが何の武器もなく実現解決することは困難です。そういったエンジニアに力を貸してくれるのがAkkaのようなOSSのツールキットだと思います。
フレームワークやツールを開発するミッションを持つ人たちは別として、エンジニアは開発するサービスや企業の利益に貢献できるコードを書くことこそが最大の価値だと考えています。Akkaは、そういった「お金になるコード」に注力させてくれるという役割も担ってくれるのではないでしょうか。
根来和輝さん
リソースを最大限活用するには、マルチコアを利用した並行プログラミングが有効です。しかし、並行プログラミングには変数を更新する際に同時実行制御が必要なのと、エラーハンドリングを行うとコードが複雑になってしまうという問題があります。
また、システムにスケーラビリティを持たせるために分散システムを構築する際は、並行プログラミングの問題に加えてサーバー間の一貫性をどう保証するかといった問題に直面します。
Akkaはこのような並行・分散処理に伴う問題を解消しやすくする仕組みを提供します。これにより、我々ITエンジニアはより安全に、前述したようなシステムを構築できるようになります。
『Akka実践バイブル』を読んでもらい人は
Konrad Malawskiさん
本書はScalaとAkkaを連れて冒険を始めている開発者が対象です。そして、リアクティブシステムをよく知らない開発者が、自信を持って開発を始められる状態へとステップアップすることを目指しています。実用的な例が挙げられているので、容易に日々の作業でも適用することができます。また、PHPやErlang、Elixirなどの開発者にとっても興味深い本となるでしょう。
しかしながら、本書は非常に実践的なので、高水準のアーキテクチャーの概念にはあまりフォーカスしていません。リアクティブシステムのアーキテクチャー設計パターンについて詳しく知りたい場合は、Roland Kuhnの『Reactive Design Patterns』をご覧になることをお勧めします(これはまだ日本語に翻訳されていませんが)。
この本はAkkaがこのようなシステムの一般的なアーキテクチャーのどこに適合しているかを理解するために、本書のよいフォローアップになるでしょう。
前出祐吾さん
Akkaを使わずに並行処理を実装している方、分散システムを構築している方にぜひ読んでもらいたいですね。リアクティブシステム、アクター、Akkaといったキーワードを一つでも耳にしたことがある、あるいはこの記事を読んで気になった方。「それって、アプリケーションを複数のサーバーで起動し、ロードバランサーで負荷分散させるのと何が違うの?」と思った方など。
そして個人的には、エンタープライズシステムの開発に携わる方にも読んでほしいです。本音を言うと一番読んでもらいたいのは弊社の人たちです。そのくらいお勧めの本です。
根来和輝さん
本書では基本的にScalaのコードを示しながらAkkaの扱い方を解説していますが、Scalaの高度な知識を必要としないように書かれています。Scalaの入門チュートリアルなどをひととおり理解できたエンジニアであれば、問題なく読み進められるはずです。
また、付録としてJava APIの解説も書かれているため、Javaのエンジニアにとっても活用しやすくなっています。並行・分散処理のプログラミングをScalaで行う場合に、基礎知識として必要なFutureの使い方なども詳しく解説されているため、あまりそのような処理に馴染みのないエンジニアでも読み進められる内容になっています。
釘屋二郎さん
何と言っても、ScalaとAkkaを使って何らかのアプリケーションを作ろうとしている人が対象です。Scalaで並行処理を書く方法は2つあるので(Futureとアクター)、どちらを使えばいいか迷ったりする人も多いのではないでしょうか。本書では両方の違いについても解説されています。
想定読者というよりも読んでもらいたい人として、単にHTTPのエンドポイントを簡潔に書けることを中心にWebフレームワーク(や言語)を選定してしまうエンジニアも挙げられます。
もちろん、Akkaも複雑な事柄を簡潔にしてくれますが、SpringやASP.NET、Railsなどとは関心としている領域がまったく違います。Webフレームワークを紹介する書籍だと、単にアプリケーションをどのよう動作させるかということやシェアがどれだけあるという話に終止してしまいがちなのですが、本書ではスケーラビリティ(リアクティブであること)という付加価値をどう作るかということについての手掛かりを学ぶことができます。
『Akka実践バイブル』の狙いは
Konrad Malawskiさん
この本を読むことで、Akkaを使用した回復性と即応性の高いアプリケーションを構築できます。ドキュメントやほかのオンラインリソースから、より高度なトピックを学び続けるための出発点として有効です。
典型的な使用例は、たくさんの9が並ぶ稼働率や非常に速いレスポンスタイムを必要とするシステムです。Akkaはストリーミングエコシステムにも完全に適合します。Reactive Streamsの取り組みを牽引し、今では公式のJava 9リリースにも含まれています。
Akkaを用いて構築したシステムはエンドユーザーへより優れた体験を提供することがすべてです。これは、システムをより迅速に構築してデプロイできることによって実現されます。そうすれば、従来のモノリシックなシステムよりも高速に動作し信頼性も高くなります。
前出祐吾さん
Akkaは困難だと言われている並行処理や分散処理を実現するための現実的な解決策を与えてくれます。本書ではそれを実現するため、アクターモデルによる設計やAkkaによる実装方法をソースコードを交えて紹介しており、大きなチュートリアルのような感覚で実装を体感しつつ読み進められます。
Akkaで実現できることを網羅的に解説しているので、タイトルどおり実践バイブルとして、過去にAkkaの習得に挫折した方の課題も解決してくれることでしょう。
根来和輝さん
リソースを最大限に活用したり、スケーラビリティのあるシステムを構築したりするためにはAkkaの流儀に従ってシステムを組み立てる必要があります。本書では、Akkaの流儀を学べるのはもちろんのこと、なぜそのような流儀になっているのかという解説も書かれています。
その流儀は並行・分散システムにおいて一般的に伴う問題に対処するためにあります。そのため、Akkaを利用せずに並行・分散システムを構築する際に活用できる一般的な知識も得ることができます。
釘屋二郎さん
本書の基本的な筋はAkkaというライブラリの使い方ですが、Enterprise Integration Patternsという並行システムのための古典的なパターンや、シャーディングや負荷分散、スレッドプールの使い方といったライブラリの使用方法に留まらない設計思想や技術的背景への言及があります。
システムがスケーラビリティに関する問題を抱えていてパフォーマンスを出すことができないのなら、本書に書かれていることを手掛かりに課題を解決できるかもしれません。
Akkaを現場で活用する際に注意することは
Konrad Malawskiさん
Akkaを使ってシステムを構築するとき、またはPlayやLagomのようなツールを使用してシステムを構築するときに最も注意することは、どのツールキットを選択すべきかを知ることです。
たとえば、Akkaは永続キューであるKafkaとの統合だけでなく、Pub/Subも提供しています。保証内容やフォーカスするポイントが異なるため、モジュール間の違いを理解することが重要です。
Akkaクラスタを使用するとメッセージキューよりも何倍も高速に処理でき、実際のネットワーク上の2つのAkkaノード間で1秒間に100万件ものメッセージが届きます。しかしながら、処理フェーズを切り離すためにキューを使用することが適切な場合もあれば、そうでない場合もあります。
この本を読み、Akkaツールキットのさまざまなツールについて学び続けることで、様々な問題に対する「仕事のための最善のツール」を理解して選べるようになります。そうすれば、最初から最後までスムーズにシステムを構築し運用できるようになるでしょう。
前出祐吾さん
当然の話ですが、Akkaが適するシステムとそうでないものがあるということと、なんでも願いを叶えてくれるドラえもんの四次元ポケットではないということです。
たとえば、それほどトラフィック量は多くなく、1台のサーバーで十分だというシステムにはもっとシンプルな構築方法があるでしょう。また、トラフィックがどんどん増えてきてクラウドでスケールアウトできるシステムを作りたいときに、Akkaをインストールするだけですべて解決できるというものでもありません。
Akkaのアクターがどんなふうにスレッドを使うか、どんなふうにスケールするのか、ダウンしたらどうなるか、メッセージは必ず届くのか、捌ききれないストリームデータが流れてくるとどうなるか、などを学んでおく必要があります。
それは、親しみのあるDBMSへのCRUD操作が中心のアプリケーションとはモデルが異なるからです。だからといって、決して億劫になる必要はありません。そのためにAkka実践バイブルを翻訳しましたので。
根来和輝さん
Akkaを正しく活用するには、従来のクラスとそのメソッドの呼び出しを使ったプログラミングモデルとは異なるプログラミングパラダイムを理解する必要があります。また、並行・分散処理をプログラミングする際に注意しないといけない事柄を認識しなければならず、新しいWebフレームワークを学ぶのに比べて学習コストが高くなります。
そのため、いきなりシステム全体でAkkaを使おうとはせず、始めはバッチ処理をAkkaで高速化し、徐々に重要度の高いオンライン処理に適用していくといった具合に適用していくのがいいでしょう。
釘屋二郎さん
Futureやアクター、Streamといった言語やライブラリが提供している概念の違いを理解していくことが重要です。特に最初はFutureとアクターのどちらが速いのかという話になってしまいがち(私が知る範囲では)なのですが、両者の違いはそこではありません。
Akkaはフレームワークではなくライブラリなので、同じ問題に対していろんな解決策がありえます。なので、現実の問題を解決するには一般的なパターンや背景知識を継続的に学んでいくことも必要になると思います。