じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

『Learning Dapr』を読んだので感想文

『Learning Dapr』を読んだ。

輪読会ではなく共有会としての読書感想文を記載しました。Dapr に関する素晴らしい書籍だと思うので共有会を通して皆さんに共有したいと思います。

誰が読むべきか?

  • Dapr の実装が必要な方
  • 分散システムに関して兎に角見聞を広げたい方

Learing Dapr について

learning.oreilly.com

どんな本なのか?

Daprがステートレス、ステートフル、アクタープログラミングモデルを統合するだけでなく、クラウドやエッジのあらゆる場所で実行される方法を背景からその将来について開発者自ら、説明してくれている書籍。話の主軸がDaprであるためどうしても、Daprを利用する以外では他の書籍を読んだ方が効率が良いというか理解しやすいと思う。分散システムの実装に関して別の観点から理解を深めたければ読めば良いと思う

また、どんな本ではないのか?

分散システムを学べる本ではない

Kubernetes が学べる本ではない

主要なコンテナオーケストレーターであるKubernetesを本番環境で動かすために役立つベストプラクティスやKubernetes の概念が学べる本ではない。

Production Kubernetes

Golang に入門できる本ではない

Golang の入門的な内容はなく各章ごとに適当な言語で書かれている

The Go Programming Language

マイクロサービスに関する本ではない

マイクロサービスのためのシステム分割や設計のレベルから解説する本ではない。 あくまでdapr のための書籍であってシステム分割や設計が前提として

マイクロサービスパターン 実践的システムデザインのためのコード解説 - インプレスブックス

Dapr とは

そもそも、Dapr とは、Microsoftが中心になって開発しているOSSの分散アプリケーションランタイム、Distributed Application Runtimeの略でDaprです。

Dapr は様々なクラウドサービスやミドルウェアを良い感じに透過的に扱うことを目的としたプロダクトで、なかなか筋が良いのですが、何に使えるかよく分からないというか、そもそもどういうものか分かりづらいので今回はオライリーから出版されたLearning Dapr を年末に読んだので共有会で共有していこうと思います。

スター数が15K とかなりいきおいのあるOSSのプロジェクトではないかと思います

Daprの特徴

Dapr はサイドカーとして利用することで。本来実装したいコアロジックに集中でき簡単にマイクロサービスを作成することができます。また、デプロイする環境はKubernetes もしくはローカル環境を選ぶことが来ます。

更にそれぞれのビルディングブロックは抽象化されており、 HTTP/gRPC API を通して利用するものとなっているため言語に縛られない開発ができるのも魅力となっています。それぞれのコンポーネントはライブラリとしてアプリケーションに組み込むのではなく、yamlコンポーネント定義ファイルをロードさせることで利用することができるので実装に一切手を加えず、検証環境ではredis、本番環境では何かしらのクラウドサービスなど切り替えが可能。

Service-to-service invocation: /v1.0/invoke

  • 他のマイクロサービスサービスへ通信するための機能

State management: /v1.0/state

  • key/valueベースの永続化や参照機能

Publish and subscribe: /v1.0/publish and /v1.0/subscribe

  • Publish/subscribeモデルで非同期にメッセージを送受信する機能

Resource bindings: /v1.0/bindings

Actors: /v1.0/actors

  • 分散性や並行・並列性をもち、非同期なメッセージ駆動のアクターモデルを提供

Observability

  • ログ・トレース・メトリクス・ヘルスチェックといったオブザーバビリティに必要な要素を提供(この辺の情報は整理してObservability Conference 2022にCfPに投げます)

Secrets: /v1.0/secrets

  • 安全にパスワードなどのクレデンシャルなデータにアクセスする機能

Extensible

サポートしてるSDK

daprが提供する HTTP/gRPC API にアクセスするためのsdkを利用することもできます(クライアント同士の直接参照も可能なので)。提供されているSDKは、以下の8つの言語になります。

今後、サンプルを書く際にはGo-sdk を利用して書いていくこととします。

Dashboard

個人的に気に入っている機能としてはダッシュボードの存在があります。Kubernetes に対しても実行できるので非常に重宝をしております。 https://github.com/dapr/dashboard/blob/master/docs/development/changelog.md

やっと、目次

全7章から成り立っています。どの章も公式ドキュメントよりも背景であったりとかメタ情報が付与されており

1. Services

Dapr 対応アプリケーションの基本的な単位はサービスと呼ばれます。この章では各サービスの状態管理やトレース、必要なときに安全な通信様々な機能がどのように使えるのかを簡単に説明した章になります。この章までであれば公式ドキュメントを読めば大体なんとかなる

2. State

Dapr の状態管理は、プラットフォームに依存しないクリーンな状態処理コードを記述しながら、これらの課題に対処するのに役立つ単純な状態APIを提供することを目的としています。

状態管理についてクラウド化や様々なデータストアにどのように対応していくかどういった方法が取れるかなどが記載がされております。

3. Messaging

Dapr は pub/sub にKafka やRabbitMQなどをバインディングすることが可能で一般的なメッセージング構造を提供しますが、独自のメッセージングバックボーンを作成しません。 Dapr の pub/subを使用すると、メッセージパブリッシャーはトピックにメッセージをパブリッシュでき、トピックのすべてのサブスクライバーはメッセージのコピーを取得できます。Daprは、メッセージが少なくとも1回処理されることを保証します。 上記で説明したようにDaprはpub/sub に外部リソースのバインディングが可能でそれらをもとにシステムを作成することができます。 この章ではそういったdaprの機能や特性を活かしてどのようなアーキテクチャが考えられるかについて書かれた章

4. Security

Daprは追加の機能としてではなくデフォルトで提供します。それらがどのように実装されているかという記載はないですがどうやって実装していくかについて記述がされている。 Daprは、シークレット管理、シークレットAPI、相互TLSサポートなどの基本的なセキュリティ機能のセットを提供しています。いくつかの追加のセキュリティ機能のIssueや が挙げれらている。

5. Actors

Daprは、クラウドネイティブで復元力のあるプラットフォームに依存しない仮想Actorモデルを提供します。ActorランタイムはDaprランタイム内で実行されるため、Dapr上に言語固有のアクターSDKを簡単に記述でき、他の機能と同様にHTTPまたはgRPCを介して任意の言語からアクターを呼び出すことができます。 この章ではActor によるターンベースの同時実行、状態管理、Timer やreminderなどの独自の機能を説明している。 Daprがアクターインスタンスを独立したプロセスとしてではなく、同じWebサービス上のルーティングルールとして扱うことです。これにより、Daprは高密度でアクターインスタンスをホストできます。

6. Application Patterns

daprのアプリケーションコードは、さまざまなイベントソースからのイベントに応答し、コネクタを介して他のシステムにイベントを送信/受信できます。クラウド環境でどのように利用できるのか?既存のサービスメッシュとどのように協業するのかについて記載がされている章 単発で為になる記載もいくつかあったが何回読んでも難しすぎて参考文献になりそうなものを読んだりして行ったり来たりしてる

7. Dapr’s Future

シェルスクリプトとしてのdapr の実行やWebAssembly,アクターの各種機能など Dapr が将来どのように成長するかを開発者自身が書いてくれている章