青いセーターを着た人がコンピュータで作業している
Microsoft Base ロゴ

技術ブログ

Azureに関する技術情報

すべての開発者がマイクロサービス アプリケーションをより簡単に構築できるようにするためのオープン ソース プロジェクト、Dapr (Distributed Application Runtime) の発表

Open Source

※このポストは、2019 年 10 月 16 日に投稿されたAnnouncing Distributed Application Runtime (Dapr), an open source project to make it easier for every developer to build microservice applications に加筆および更新を行ったものです。

クラウドコンテナーコミュニティ ニュースマイクロソフト

スケーラブルなクラウド ネイティブ アプリケーションを構築し、管理されたサービスを利用してそれらを展開および実行する開発者がますます増える中、ここ数年間で目を見張るような変革が起きています。この変革によって、マイクロサービス アーキテクチャがクラウド ネイティブ アプリケーションの構築の標準となっており、2022 年までに、新しいアプリの 90% でマイクロサービス アーキテクチャが採用されるようになるだろうとみられています。マイクロサービス アーキテクチャは、スケーラビリティ、サービスの疎結合、独立した展開などの魅力的なメリットをもたらしますが、このアプローチは、分散システムに関する知識やスキルという大きな代償が必要になる場合があります。

開発者は、プラットフォームを利用して、必要なスケール、回復性、メンテナンス性、弾力性、およびクラウド ネイティブ アーキテクチャの他の特性をそれらのアプリケーションに提供すると同時に、レガシ コードを頻繁かつ段階的に移行して、ビジネス ロジックに集中したいと考えています。しかし、開発者は、クラウドとエッジ間の移植性が限られていることを理解しています。そして、ステート管理、イベントの呼び出しと処理を行う回復性があるメソッドなど、最終的に同じ分散システムの問題を解決することになるという状況に頻繁に陥っています。また、多くのプログラミング ランタイムは、範囲が狭い言語サポート、厳しい制約のある機能セットを特徴としており、マイクロサービス アーキテクチャの構築を難しいものにしています。

イベント ドリブン、ステートレス、および ステートフル アプリケーションの構築

たとえば、複数のサービスで構成される e コマース アプリケーションを構築する際、ステートフル アクターを使用して、カート サービスを表現し、決済サービスおよび出荷サービスのステートレス機能を呼び出したいと思うかもしれません。このようなアプリケーションを作成するには、複数の言語、開発フレームワーク、インフラストラクチャ プラットフォームとの連携、および外部サービスとの統合が必要になる場合があります。開発者は、このような複雑な技術スタックについて理解し、これを管理しなければならないため、ビジネス価値を実現する取り組みに集中できません。

microservices app diagram

新しいコードの記述、既存コードの移行を問わず、任意の言語および任意のフレームワークを使用するすべての開発者が移植可能なマイクロサービス アプリケーションを簡単に構築できるようにするために、このたび、Dapr (Distributed Application Runtime) がリリースされることになりました。

Dapr: クラウドとエッジのためのマイクロサービスのビルディング ブロック

Dapr は、オープン ソース、移植可能、イベント ドリブンを特徴とするランタイムです。これを用いることで、開発者は、クラウドとエッジで動作する、回復性があるマイクロサービスのステートレスおよびステートフル アプリケーションを簡単に作成できます。Dapr は、多様なプログラミング言語および開発フレームワークをすべてサポートし、e コマースの例のようなアプリケーションの構築を簡素化します。

Dapr は、任意のプログラミング言語で呼び出せる標準的な http や gRPC API によってアクセスされる一連のビルディング ブロックで構成されています。これらのビルディング ブロックは、実績ある業界のベスト プラクティスですべての開発者の能力を強化します。また、各ビルディング ブロックは独立しているため、アプリケーションでビルディング ブロックの 1 つだけを利用したり、複数のビルディング ブロックを利用したり、すべてのビルディング ブロックを利用したりすることができます。さらに、オープン ソース プロジェクトを通じて、コミュニティが新しいビルディング ブロックを追加したり、既存コンポーネントに新しいコンポーネントを追加するのも歓迎です。Dapr は、プラットフォームに全く依存しないため、ローカル、任意の Kubernetes クラスター、および Dapr と統合するその他のホスティング環境でアプリケーションを実行できます。Dapr を用いることで、開発者は、コードを変更せずに、クラウドとエッジの両方で実行できるマイクロサービス アプリケーションを構築できます。

標準的な API で Dapr のビルディング ブロックを呼び出し、任意の言語および任意のフレームワークを用いてアプリケーションを構築

Dapr overview diagram

今回のアルファ版のリリースにおける Dapr のビルディング ブロック

マイクロサービスの設計および構築時には、数多くの機能が必要になります。今回初となるオープン ソースの Dapr のアルファ版のリリースでは、最も頻繁に使用される一部のビルディング ブロックの提供に焦点が置かれています。

  • サービスの呼び出し – 回復性があるサービス間の呼び出しにより、サポート対象のホスティング環境のどこで実行されている場合でも、リモート サービスで再試行を含むメソッドの呼び出しを行うことができます。
  • ステート管理 – キー/値ペアのステート管理により、同じアプリケーション内で、ステートレス サービスとともに、実行時間の長い、高可用性のステートフル サービスを簡単に作成できます。ステート ストアはプラグ可能であり、コンポーネント ロードマップの AWS DynamoDB などの他のデータベース サービスとともに、Azure Cosmos や Redis を含めることができます。
  • サービス間のパブリッシュ/サブスクライブ メッセージング – サービス間のイベントのパブリッシュとトピックのサブスクライブにより、イベント ドリブン アーキテクチャで水平方向のスケーラビリティを簡素化し、障害に対する回復性を実現できます。
  • イベント ドリブンのリソース バインディング – リソース バインディングおよびトリガーは、データベース、キュー、ファイル システム、Blob ストア、Webhook などの任意の外部リソースとイベントをやりとりし、スケールと回復性を実現するイベント ドリブン アーキテクチャに一層基づいたものになっています。たとえば、Azure EventHub サービスのメッセージや Azure CosmosDB への書き込みデータによってコードをトリガーできます。
  • 仮想アクター – メソッドやステートのカプセル化によって同時実行を簡素化するステートレスおよびステートフル オブジェクトのパターンです。Dapr は、同時実行、ステート、アクターのアクティブ化/非アクティブ化のライフサイクル管理、アクターを起動するタイマーおよびリマインダーなど、仮想アクター ランタイムで数多くの機能を提供します。
  • サービス間の分散追跡 – W3C Trace Context の標準を使用して、実行中のサービス内の呼び出しの診断と監視を簡単に行えるとともに、追跡および監視システムにイベントをプッシュできます。

移植性と拡張性を実現する標準的な API

では、これらの Dapr のビルディング ブロックはどのように使用するのでしょうか。たとえば、Kubernetes クラスターに展開したマイクロサービス アプリケーションで Azure Functions ランタイムを使用しており、パブリッシュ/サブスクライブ パターンを利用してサービス間でメッセージを送信したいと考えているとします。現在、Azure Functions ランタイムにはこの機能が組み込まれていませんが、http を介して Dapr のパブリッシュ/サブスクライブ ビルディング ブロックを使用して、この新機能を簡単に追加できます。このようにして、開発者は新しい機能を利用できます。

さらに、Dapr のパブリッシュ/サブスクライブ ビルディング ブロックはプラグ可能なコンポーネント モデルを採用しているため、コードを変更せずに、メッセージの送信方法に関するさまざまな実装を動的に選択できます。たとえば、好みに応じて、Redis、Kafka、または Azure Service Bus の Dapr のパブリッシュ/サブスクライブ コンポーネントを選択できます。そして、どの場合でもコードはそのまま維持されます。標準的な API を使用した、複数の異なるサポート対象インフラストラクチャ間の移植も可能です。

Dapr は、移植性と、既存コードとの容易な統合の両方を実現するために、http または gRPC を介して標準的な API を提供します。引き続きパブリッシュ/サブスクライブの例を用いますが、以下のノード コードは、”http://<myappaddress>/dapr/subscribe” のエンドポイントで “A” および “B” というトピックをサブスクライブする方法、ならびにメッセージがこれらのトピックにパブリッシュされた際にアプリケーションが通知を受け取る方法を示しています。

Dapr code snippet

比較のために、ASP.NET Core のCreateWebHostBuilder() から呼び出される UseStartup() ハンドラーを使用して、C# で記述された同じコードを以下に示します。

スタートアップ クラスの dapr 実装のスクリーンショット

これらのトピックにサブスクライブされたサービスにイベントをパブリッシュするのは、トピックとペイロードの名前を用いて Dapr のローカル http パブリッシュ API を呼び出すのと同じくらい簡単です。以下のノード コードの例は、(ローカル ポート 3500 で) Dapr のパブリッシュ API を使用する方法を示しています。これは curl コマンドを使用して行うこともできます。

Dapr culture code Dapr code snippet

これらの例が示すように、サービスで Dapr を使用するのに、コンパイル時間の依存関係は必要なく、メッセージ本文で URL を作成する方法だけで済みます。

サイドカー アーキテクチャおよびサポート対象インフラストラクチャ

Dapr は、コンテナーまたはプロセスとして、サイドカー アーキテクチャとして API を公開し、アプリケーション コードを必要とせずに、任意の Dapr のランタイム コードを含めることができます。これにより、サポート性向上のためにアプリケーション ロジックを分離できるとともに、Dapr と他のランタイムの統合を簡単に行うことができます。

サイドカー プロセスとして実行される Dapr

sidecar overview diagram

Dapr は、Kubernetes などのコンテナー ホスティング環境で、同じポッドのアプリケーション コンテナーとともにサイドカー コンテナーとして実行されます。

Kubernetes ポッドのサイドカー コンテナーとして実行される Dapr

Dapr diagram

Dapr は、簡単に利用を開始でき、開発者のマシンでのローカル実行、任意の Kubernetes クラスター (minikube を含む) での実行、およびロードマップの IoT Edge、Service Fabric などの他のインフラストラクチャ プラットフォームでの実行をサポートする CLI を備えています。以下のコマンドを実行するだけで Dapr を開始できます。

dapr init  (ローカルで展開する場合)
dapr init –kubernetes  (Kubernetes で展開する場合)

開発言語の SDK およびフレームワーク

さまざまな言語でより自然に Dapr を使用できるように、Dapr には、Go、Java、JavaScript、.NET、Python 向けの言語固有の SDK も含まれています。これらの SDK は、http/gRPC API の呼び出しではなく、分類された言語 API によって、ステートの保存、イベントのパブリッシュ、アクターの作成などの Dapr のビルディング ブロックの機能を公開します。これにより、開発者は、ステートレス & ステートフルの機能およびアクターの任意の組み合わせを任意の言語で作成できます。また、これらの SDK は Dapr ランタイムを共有するため、言語間共通のアクターおよび機能もサポートされます。

さらに、Dapr を任意の開発フレームワークと統合することもできます。たとえば、Dapr の .NET SDK には、ASP.NET Core の統合機能が含まれています。これは、他のサービスからのパブリッシュ/サブスクライブ イベントへの対応を可能にするステートフル ルーティング コントローラーを提供することで、ASP.NET Core をマイクロサービス Web アプリケーションの構築により適したフレームワークにするものです。

詳細情報およびご支援のお願い

マイクロソフトは、クラウドやエッジ デバイスでソリューションを構築する WillowGeek+ をはじめとするさまざまなパートナーと提携関係を結んでいます。詳細については、まもなく開催される Ignite カンファレンスでお伝えする予定です。今回初となる Dapr ランタイムと SDK のリリースは出発点に過ぎません。マイクロソフトの目標は、ベンダー中立の基盤に Dapr を提供し、オープンなガバナンスとコラボレーションを実現することです。これは時間のかかる長い工程です。さまざまなリソースとの統合を実現する新しいバインディング コンポーネントの作成、新しいビルディング ブロックの提案、お気に入りの言語 (Cobol が好きな人はいますか?) 向けの SDK の作成など、マイクロソフトは皆さんの支援や貢献を必要としています。ご意見をお待ちしています。

Dapr の詳細については、http://dapr.io を参照してください。また、https://github.com/dapr/dapr でコードやサンプルを用いて利用を開始できます。ご不明な点などがありましたら、gitter.im/Dapr または Twitter (@daprdev) でご連絡ください。そして来週、皆さんの考えやアイデアを共有するためのミーティングが開始されます。

現在、マイクロサービスの開発が行われており、開発者にとって素晴らしい時代になっています。皆さんがどこでこのプロジェクトに参加し、何を構築するのか、そしてこのプロジェクトがどのように進化していくのか目にするのを楽しみしています。

※本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。

< 前の記事

> 次の記事

ページの先頭へ戻る