Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。この連載では非同期処理に役立つアクターモデルを学ぶため、JavaとScalaから使えるOSSであり、アクターモデルの実装を提供するAkkaを紹介します。連載の前半では非同期処理とActorの基礎的な部分を、後半では非同期処理から分散システムへと話を進めていきます。分散システムは現代のシステム構築において重要性を増しているので、Akkaが非同期処理のツールから始まって、どんな分散システムのアーキテクチャーのパターンを可能にしてくれるのかを紹介したいと思います。連載の第一回である今回は非同期処理の現状や歴史をおさらいし、そしてアクターモデルによって非同期処理の中でも、どういった問題が解決されるのかお話します。非同期処理とは現代のアプリケーション開発では非同期処理を扱う機会が数多くあるといえるでしょう。非同期処理[1]とは、処理を開始したあと、その完了を待たずに次の処理を開始するものを指します。その反対は同期処理といって処理を開始したらその完了まで一貫して行い完了するまで待つというものになります。非同期処理については、以下の記事も併せてご覧ください。3ページ以降で非同期処理の概要や利点について分かりやすく紹介されています。クラウド・ネイティブのお作法(1)「非同期処理」~24時間365日ダウンタイムがゼロのシステムのために必要なこと近年この非同期処理が数多く使われるようになった背景には、アプリケーションの軽快な動作を実現したいという要求が増えてきたことにあります。非同期処理を使うとどうしてアプリケーションが軽快に動くのかを理解するために、複数の機能があるモバイルアプリケーションを例に挙げて考えてみましょう。上図のモバイルアプリケーションではニュースフィード機能があり、ニュースにはユーザーがコメントをつけることができます。アプリケーションのバックグラウンドではチャット機能が動いています。ニュースへのコメント、次のニュースの受信、チャットメッセージの受信と、このモバイルアプリケーションはさまざまな一つのアプリケーションで行います。これらの処理を同期的に、つまり一つの処理が始まってからその完了まで待つ形で行うのは効率的ではありません。以下の図は同期処理全体の流れを一つの時間軸に並べたものですが、ニュースフィード取得やチャットメッセージ取得などアプリケーション外部とのやり取りのために「待つ」ための時間帯があります。待っている状態のアプリケーション画面上では例えばスピナーが回る、あるいはフリーズするといった形でユーザーは他の操作ができなくなりユーザーにとってストレスになります。待ち時間の分非同期処理に比べて全ての処理が終わるまでの時間も長くかかってしまうことになります。非同期処理の場合はアプリケーション外部とのやり取りの際、データの取得完了を待っている間にも画面上で他の操作を行うことができます。下図の例でニュースフィードの取得完了前にチャットメッセージの取得を始めているように、前の処理の完了を待たずに次の処理を始められるので、複数の処理全体をより短い時間で完了させることができます。ここまではモバイルアプリケーションのクライアント側を考えてきましたが、同時にたくさんの処理を行わなくてはならないのはクライアント側だけではありません。サーバー側では非常に多数のクライアントからの同時接続を受け付ける可能性がありますし、データベースとのやり取り、社内の他のマイクロサービスとの通信、あるいは外部のAPIと連携する必要があるかもしれません。サーバー側でも捌くことのできない処理が積み重なるとクライアントへの応答が遅れ、最悪の場合サービスの利用が一時的にできなくなってしまいます。非同期処理がこういった場面で重要になるのは、処理全体を考えたときのスループットすなわち単位時間あたりの処理数を向上できるからです。これによってアプリケーションはクライアント側でもサーバー側でも軽快な動作を実現できます。非同期処理にはメリットばかりではありません。非同期処理を正しく組み合わせてシステム全体の処理を安全に実現することは困難さがともないます。歴史的にさまざまな技術者や研究者が非同期処理を安全に行うための手法を提案してきました。Modelが導入されました。40ページを超えるこの仕様はJavaにおける非同期処理をいかに安全に行うかについて書かれていますが、現代から見るとそこで語られるツールや概念は低レイヤーの話であり、使いこなすにはJavaのメモリに関する微細な動作の理解が要求されるものでした。現代ではさまざまな非同期処理ツールが利用可能で、さまざまなプログラミング言語で非同期処理を行うツールが用意されています。GolangではGoroutine/Channel、JavaScriptではasync/awaitおよびpromise、KotlinではCoroutineなどがあり、ここに書いた以外にもさまざまなツールが利用されています。どのツールを使うかによらず、非同期処理では最大限「イミュータブル(不変)オブジェクト」を利用するというベスト・プラクティスが広がり、これによって非同期処理のハードルが下がる面も大きかったと思います。Modelが導入された当時、非同期処理の難しさの根源には「スレッド間共有」かつ「ミュータブル(可変)」なオブジェクトをどう安全に扱うかという問題がありました。イミュータブルオブジェクトのみを使っている限りそういった難しい問題に直面する必要はないのです。イマオカ)大学卒業後、9年間証券会社にてプログラマ兼技術サポートとして勤務。その後いくつかの企業でバックエンド・エンジニアや技術広報などを務める。プライベートでは過去にScala/JavaのOSSであるakkaへ貢献。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。12:00法務担当者、6割超が今後業務で「生成AIを使用したい」と回答。12:00オルツ、日本語RAGでは軽量型LLMとして世界最高の精度と推論速度を達成した「LHTM-OPT2」をリリース新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。