ここから本文です

Play、Akka、Akka Streams、Lagom、Apache Spark――“Lightbend Reactive Platform”とは何か

8/29(火) 8:10配信

@IT

 リアクティブプログラミング(以下、RP)の概要や、それに関連する技術、RPでアプリを作成するための手法について解説する本記事。

Activator ui(その1)

 本記事では今後、RPのライブラリ/プラットフォームの中でも、Lightbend社のリアクティブ開発プラットフォームである「Lightbend Reactive Platform」を使用して、実際にリアクティブなアプリケーションを作成していきます。まず今回は、Lightbend Reactive Platformがどういったものなのか詳細に見ていきましょう。

●Lightbend Reactive Platformとは

 Lightbend Reactive Platformとは、Lightbend社(※旧Typesafe社)が開発したリアクティブなアプリケーションを構築するための開発プラットフォームです。

 図にあるように、Lightbend Reactive Platformでは開発者向け機能と、サブスクリプションを購入することで使えるProduction機能があります。

 開発者向け機能の方は、「Play framework」「Akka」などのコア部分を構成するアプリケーションフレームワークやランタイムライブラリで構成されており、全てオープンソースとして公開されています。

 一方Production機能の方は、アプリの管理やモニタリング機能、さらに分析機能や統合のためのツールなどを提供します。

●開発者向け機能

 では、Lightbend Reactive Platformを構成する各製品について簡単に説明していきましょう。

○Play――ステートレスで軽量なアプリケーションフレームワーク

 Play framework(以下、Play)は、ステートレスで軽量なアプリケーションフレームワークです。JavaかScalaを用いてコーディングします。

 PlayはAkkaや「Akka Streams」をベースに構築されており、ステートレス、非同期、非ブロッキングで動作します。そして、高い応答性や弾力性など、リアクティブシステムが持つメリットを備えています。

 2017年7月現在、2.6.2が最新のバージョンとなっています。Playについて詳細を確認したい方は下記をご覧ください。

○Akka――アクターモデルのメッセージ駆動型ランタイムライブラリとAkka Streams

 Akkaはアクターモデルのメッセージ駆動型ランタイムライブラリで、伸縮性や拡張性、耐障害性を持っています。Playでも標準で採用されており、導入のための手間がかかりません。

・アクターモデル

 アクターと呼ばれるオブジェクトがメッセージを送受信して処理をします。それぞれのアクターはメッセージ受信用のメールボックスをもっており、受信したメッセージに対応した処理を行えます。

 また、Akka Streamsは「Reactive Streams」(ノンブロッキング&Back Pressureで非同期ストリーム処理の仕様)のAkka実装です。

・Back Pressure

 Publisher/Subscriberモデルを考えた場合、Subscriber側のバッファー溢れやそれを過剰に考慮したPublisherの処理をなくすために、Subscriberが許容できる処理量をPublisherに対してリクエストを送ることで効率よく処理する仕組みです。

 リアクティブなアプリを開発していく際に、Akka/Akka Streamsは非常に重要な位置付けのプロダクトです。Akka/AkkaStreamsについては今後の連載で解説していく予定です。

○Lagom――AkkaとPlayで構築されたマイクロサービスアーキテクチャ向けフレームワーク

 「Lagom」は、AkkaとPlayで構築されたマイクロサービスアーキテクチャ向けフレームワークです。マイクロサービスの開発やデプロイを簡単にできるよう設計されており、Scala/Java向けのAPIが提供されています。なお、Lagomはスウェーデン語で「ちょうどいい大きさ」という意味です。

 マイクロサービスアーキテクチャとは、小さなサービスを組み合わせてアプリケーションを構築していくアーキテクチャで、サービス同士はRESTなどで連携します。システムがシンプルになり変化に強くなるのが特徴です。

 Lagomの特徴には下記のようなものがあります。

・【Lagomの特徴1】疎結合なコンポーネント

 マイクロサービスの特徴にあるように、サービス同士を疎結合で連携させることで、変化に強く自律したシステムを構築できます。

・【Lagomの特徴2】内部APIは全て非同期で実装

 基本的にはメッセージとストリームでやりとりしますが、場合によってはRESTでの通信も可能です。

・【Lagomの特徴3】永続化API

 デフォルトではイベントベース(イベントソーシングとCQRS)ですが、「Java Persistence API」やNoSQL系のデータベースも使用可能です。

 CQRS(コマンドクエリ責務分離)とは、サーバの機能を「コマンド」(更新)と「クエリ」(参照)で分離するという考え方です。

 一般的な手法では状態変化の理由や経緯が分かりませんが、イベントソーシングでは状態が永続化されるのでなく、発生したイベントを永続化します。

・【Lagomの特徴4】外部APIはCircuit Breakerが有効

 Circuit Breakerとは、外部アクセスの成功と失敗をカウントし、エラーが閾値をオーバーしたときに自動でアクセスを遮断する仕組みです。

 Lagomを使用することで個々のサービスをマイクロサービスとして構築、デプロイし、サービス間のやりとりもシンプルに実現できるようになります。

○Spark――大規模ストリーミングデータを処理するための分散処理フレームワーク

 「Apache Spark」(以下、Spark)は、大規模ストリーミングデータを処理するための分散処理フレームワークです。もともとはカリフォルニア大学バークレー校で開発され、後にApache Foundationに寄贈されました。大規模なデータをメモリ上で高速に処理できるように設計され、APIはScalaやJava、Pythonなどで提供しています。

 分散処理とは、任意の処理を複数のコンピュータを用いて並列に処理する手法です。非常に大きなデータを処理する場合に短い時間で処理することができます。スポット的にサーバを多数用意して処理を割り当てられるため、コストを抑えて高速に処理を行えます。

 同じ系統のフレームワークとしては、「Apache Hadoop」があります。主な違いとしては、Hadoopが毎回ストレージにアクセスするのに対し、Sparkではメモリ上で処理してストレージへのアクセスをなるべく少なくしています。このため、メモリに収まるデータを処理したい場合にはSparkが適任といえるでしょう。

●Production向け機能

 Lightbend Reactive PlatformのProduction機能には、「Enterprise Suite」と呼ばれる、リアクティブアプリケーションを運用、モニタリング、解析などを行うためのツールがあります。ここではEnterprise Suiteの主だった機能について簡単に説明します。

 なおProduction向け機能は有償ですが、開発用にサンドボックス(Dockerイメージ)が提供されているので、それで試してみることも可能です(※Lightbend.comでアカウント登録が必要です)。

○Application Management――システム構築に関連するオーケストレーション機能

 クラスタ管理やロードバランシング設定、デプロイなどのシステム構築に関連するオーケストレーション機能です。Enterprise Suiteでは、「Lightbend ConductR」を使用してこれらを管理します。

○Intelligent Monitoring――モニタリング機能

 Enterprise Suiteのモニタリング機能はリアクティブアプリケーションを監視するためのいろいろな情報を提供します。

 これは「Lightbend Monitoring」とも呼ばれ、サービス内のさまざまなメトリクスを収集できます。また、収集したデータをDatadogと連携させることで、データの可視化が可能です。

●Activator uiでPlayをセットアップする

 最後に、今後RPでアプリを作成するために、Playをセットアップしておきましょう(※本稿ではHomeBrewを使用してインストールします)。

 著者が使用した環境は下記の通りです。

・OS:macOS 10.12.4
・Java:1.8.0_121

 Play 2.3より前のバージョンでは、セットアップ時にPlay本体をインストールしてplayコマンドを使用していましたが、現在は「activator」を使用します。HomeBrewを使用して「typesafe-activator」をインストールしましょう。

□□□□
% brew install typesafe-activator
□□□□

 activatorのhelpを実行してインストールされているのを確認します。

□□□□
% activator --help
Did not detect an activator project in this directory.
- activator
Load an existing project (has to be executed from the project directory)
or print this help message if no project is found



□□□□

 次に、Playアプリを作成します。「activator new」コマンドでも作成できますが、今回は「activator ui」コマンドで「Activator ui」画面を呼び出し、使用します。

□□□□
% activator ui
□□□□

 上記コマンドを実行すると、必要なライブラリをダウンロードした後、ブラウザが起動して画面が表示されます。

 「hello-scala」テンプレートを選択して「create app」ボタンを押してください。しばらくすると、hello-scalaアプリのメニューが表示されます。

 この画面でアプリのテストや起動を行えます。画面左下の「Run」ボタンを押してみましょう。先ほど作成したサンプルアプリが実行され、画面に「Hello, world!」と表示されました。

 これでPlayのセットアップは完了です。

●次回はPlayとAkka、Akka Streamsについて

 今回はLightbend Platformを構成するプロダクトについて、それぞれの特徴を簡単に解説しました。また、Playのセットアップも実施しました。Lightbend Platformがどういったプロダクトで構成され、どのような機能を持っているのか理解できたと思います。

 次回はPlayとAkka、そしてAkka Streamsを紹介する予定です。

●著者紹介
○中村修太(なかむら しゅうた)
クラスメソッド勤務の新しもの好きプログラマーです。数年前に東京から山口県に引っ越し、現在もリモート勤務しています。最近の趣味は空手とぬか漬け作り。

最終更新:8/29(火) 8:10
@IT