API公開による不確実性の高まり

SMAC/IoT/AI/APIなどデジタルビジネスの申し子のようなキーワードが技術誌のみならず、ビジネス誌をも席巻してきています。APIは近年「オープンAPI」とも呼ばれ、金融庁によるAPI公開の実質義務化が提示されるなど、公開する時代になってきています。

APIによりこれまで以上に企業システム同士が繋がるようになり、場合によっては不特定多数のユーザからのアクセスが、一時的・瞬発的に集中するケースがあります。天空の城ラピュタが放送される際一斉に破滅の呪文をツイートしたり、テレビ番組でクイズに回答や投票をしたり、通常時とは異なる離散的で急激なアクセス増にどうやって備えるかは、システムアーキテクトの頭を悩ます種になります。

リアクティブとは

「リアクティブ」という言葉を聞いたことがあるでしょうか。直訳すると「反応性」となり、不特定多数のユーザやIoT機器にAPIを公開する時代においても、非機能面含めて応答を返すシステムをどのように実現していくかについて、重点が置かれた概念になります。

著名なシステムアーキテクト達によって作成された「リアクティブ宣言」では以下の4点を満たすものとしてリアクティブシステムを定義しています。

まずは、これまでよりも高速なレスポンス要求への対応として「即応性」があります。これを実現する手段として「耐障害性」「弾力性」「メッセージ駆動」があります。

クラウド時代がなせる業になりますが、Auto-Scalingなどの技術を用いて急激なリクエスト増減に応じてリソースを伸縮させるのが「弾力性」です。

「耐障害性」はこれまでの「壊れない」ための冗長化構成のような仕組みに加えて、いかに早く復旧するかという「回復性」も兼ね備えます。

「メッセージ駆動」はnodejsなどのノンブロッキング技術を用いた「非同期性」を実現します。これによりシステムのリソースの効率利用などが可能になります。

リアクティブの4つの特徴と関係性

2005年頃、StrutsやSpringなどの開発フレームワークがもてはやされ、2010年頃、開発プロセスの分野では顧客へ提供する価値を重んじ、ウォーターフォールへのアンチテーゼとしても扱われたアジャイルが注目されました。XX宣言という意味では「アジャイルソフトウェア開発宣言」を連想された方もいらっしゃるのではないでしょうか。

昨今では、上述の「開発フレームワーク」や「開発プロセス」がコモディティ化してきて、マイクロサービスやAPIが「アーキテクチャ」や「生産技術」のトレンドとなってきました。クラウドネイティブ時代に欠かせない「The Twelve-Factor App」と並び、「リアクティブ」が重要視されてきたように感じています。

先に挙げた、リアクティブの4つの特徴の内容の詳細は以下の通りです。

表 : リアクティブの4つの特徴の内容

特徴(日本語訳) 特徴(英語) 内容
即応性 Responsive 3秒ルール・7秒ルールと叫ばれたWebシステムの時代からミリ秒での応答を求められる時代において、その他の3つの特徴(耐障害性、弾力性、メッセージ駆動)を用いて高速なレスポンスを実現する。
耐障害性 Resilient 部分的な障害によって、応答を返せなくなるということは、即応性を失うことに直結します。メインフレームのようなシステムに限らず重要な要素となります。コンポーネント化による障害箇所の分離などの技術を用いて、システム全体の可用性を高める点に加えて、障害発生時にいかに通常運転に戻すかという「回復性」が重要視されます。
弾力性 Elastic クラウドが当たり前の時代となっており、以前のようにピーク日・ピーク時間の負荷モデルを元に、設計時に割り振ったCPUコアを固定的に使うのではなく、Auto Scalingなどのクラウド技術を用いて、CPUコア数を負荷に応じて可変にする。これにより、想定外の高負荷に対応するとともに、閑散期には最低限のCPUコアとすることでCPUリソースを有効利用する。
メッセージ駆動 Message Driven 上述の「応答性」「耐障害性」「弾力性」を実現する手段。メッセージング技術の活用により処理間・API間を非同期にし、疎結合にする。
  • 「応答性」「弾力性」:並列性を高め、CPUコアの増加に伴って性能がスケールすることを可能とする。
  • 「耐障害性」:呼び出し先の状況に依らずメッセージを返す。Circuit Breakerとの親和性が高い。

リアクティブプログラミング

リアクティブプログラミングは「非同期なデータストリーム」を使う手法で、イベント駆動型のアプリケーションのプログラミング手法の一つです。前述のリアクティブ(システム)とは異なる概念/言葉になります。Reactive Streamsにより標準化を目指しており、サービス間を疎結合にできる特徴などからAPIやマイクロサービスとの相性が良いとされています。

概念的には、「ストリーム」と呼ばれる川に、流れてくるデータ一つ一つを岸で受け取り、「非同期」で処理していきます。データを流す側を「生産者」(Producer Publisherとも呼ばれます)、受け取る側を「消費者」(Consumer Subscriberとも呼ばれます)と呼びます。

バックプレッシャと呼ばれる流量制御の仕組みを持つのも特徴で、生産者がプッシュ型で消費者にデータを流すのではなく、消費者からプル型で生産者にデータを流すのを許可する形態をとります。さらには、消費者側ではNginxNode.jsなどで採用されているノンブロッキングI/Oを採用し、より並列性の高い処理を実現します。

ストリームを流れるデータと「生産者」「消費者」の関係性

リアクティブプログラミングの実装ライブラリとしてはReactJS・RxJS・RxJavaといったものが有名です。加えて、Spring・JavaEEなど、主要なフレームワークがリアクティブプログラミング対応を謳ってきています。例えばSpringはバージョン5.0よりFlux・MonoなどのPubllisherを用いたリアクティブプログラミングに対応予定です。

*  *  *

今回は、リアクティブ宣言の解説をベースにリアクティブの4つの特徴を説明しました。また併せて、リアクティブプログラミングにおける非同期なデータストリームに関するイメージを掴んでいただきました。

SoE(System of Engagement)とも呼ばれ、APIなどを通じて企業間のシステムやIoTデバイスが繋がるようになり、システムを取り巻く不確実性がますます高まってきています。高負荷対応の秘訣としてリアクティブをご検討されてみてはいかがでしょうか。

著者紹介


正野 勇嗣 (SHONO Yuji ) - NTTデータ シニアスペシャリスト

2011年頃まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。

最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。2児のパパ。