Slide 1

Slide 1 text

Service Weaver で始める モジュラー モノリス、 そしてマイクロサービスへ 頼兼 孝幸 Google Cloud Japan Application Modernization Specialist

Slide 2

Slide 2 text

スピーカー自己紹介 Google Cloud アプリケーション モダナイゼーション スペシャリスト 担当製品エリア: ● GKE ● サーバーレス(Cloud Run、Cloud Functions など) ● CI / CD 頼兼 孝幸

Slide 3

Slide 3 text

モダンなアプリケーション開発の変遷

Slide 4

Slide 4 text

Proprietary + Confidential Legacy Modern モジュール性が低い: 高度に結合されたビジネ ス ロジックとモノリシック アーキテクチャ モジュール性が高い: 結合度の低いビジネス ロジックとマイクロ サービス アーキテクチャ モジュール性

Slide 5

Slide 5 text

Proprietary + Confidential On-premise server Cloud delivery platform Legacy Modern 弾力性が低い: 自己管理型の スケーリングとインフラ 弾力性が高い: オンデマンドの スケーリングとインフラ 弾力性

Slide 6

Slide 6 text

Hosted / managed virtual machines (OS) Fully-managed container platforms (GKE, Cloud Run) Legacy Modern ポータビリティが低い: セルフマネージド OS、 ライブラリ、依存関係 ポータビリティが高い: 依存関係管理の簡素化 ポータビリティ

Slide 7

Slide 7 text

Legacy Modern アジリティが低い: チーム間の連携を強化 してアップデートを 展開する アジリティが高い: 個々のチームが個別に アップデートを展開 できる アジリティ

Slide 8

Slide 8 text

Plan Code Test Release Deploy Maintain Build 2010s Plan Code Test Release Maintain Build Deploy 理想 Shift Left Outer loop Inner loop 短縮される outer loop サイクル タイム Time Spent Platform Developer Roles “You build it, you run it.” - Platform 理想としてはサイクル タイムが短縮されるはず ※ マネージド環境を利用すると、より短縮可能 (本セッションでは言及しない)

Slide 9

Slide 9 text

理想 Plan Code Test Release Maintain Build Deploy 現実 Shift Left Plan Code Test Release Build Deploy 計画の長期化 テスト責務の肥 大化 オペレーションの 複雑化 Maintain インシデント対 応の長期化 Time Spent Platform Developer Roles inner loop の長期化 Developer の さらなる責務 現実に見られるイノベーション能力の低下

Slide 10

Slide 10 text

テスト責務の 肥大化、複雑化 マイクロサービス環境に おけるコードのテストと デバッグが難しい 事前計画、 設計の長期化 マイクロサービス環境の計 画と設計などに多くの時間 を費やしてしまう 開発オーバーヘッドの 肥大化 ローカル、ステージング、本 番環境間でのアプリの 移植性が、アプリ開発の 課題になる インシデント対応の長 期化 十分な可観測性ツールが 不足しており、頻繁な サービス停止発生に繋がる Developer の苦悩

Slide 11

Slide 11 text

Service Weaver の紹介

Slide 12

Slide 12 text

2023 年 3 月 1 日に Google が発表した 分散アプリケーションを作るための フレームワーク(公式ブログ、GitHub) モジュラー モノリスとして書いた アプリケーションをマイクロ サービス としてデプロイできる Service Weaver とは Write your application as a modular binary. Deploy it as a set of microservices. Service Weaver is a programming framework for writing and deploying cloud applications. https://serviceweaver.dev/

Slide 13

Slide 13 text

モジュラー モノリスとは 単一のデプロイメント ユニットの中で ドメイン分割されたモジュール群が 存在するアーキテクチャ StackOverflow アーキテクチャ https://newsletter.techworld-with-milan.com/p/stack-overflow-architecture

Slide 14

Slide 14 text

● コアライブラリ ○ ネイティブ データ構造とメソッド呼び出しのみを使用して、アプリケーションを単一のモ ジュラー バイナリとして記述できる Go 言語で書かれた ライブラリ、アプリケーションを書く際に利用する ● デプロイヤー(ローカル、GKE、Kube、SSH [実験的]) ○ アプリケーションのランタイム トポロジを構成し、それを一連の マイクロサービスとしてデプロイする ○ ローカルは、Single process / Multi process をサポート Service Weaver は大きく以下の 2 つから構成される

Slide 15

Slide 15 text

Service Weaver 概念図 コアライブラリ デプロイヤー ローカルや GKE に デプロイ 単一のモジュラー バイナリ として書いたコード モジュールごとに独立したラン タイムで実行される https://opensource.googleblog.com/2023/03/introducing-service-weaver-fra mework-for-writing-distributed-applications.html

Slide 16

Slide 16 text

Development

Slide 17

Slide 17 text

Application 相互に呼び出し合うコンポーネントの集合体 内部構造:アプリケーションを Service Weaver に 対応させるためのコードジェネレータ (エンコーディングやスタブなどの生成) type Rock interface { … } type Paper interface { … } type Scissors interface { … } モジュラー バイナリとして記述 // Components …

Slide 18

Slide 18 text

Application type Rock interface { … } type Paper interface { … } type Scissors interface { … } ローカルで実行 モジュラー バイナリとして記述 // Components … Rock Paper Scissors 相互に呼び出し合うコンポーネントの集合体 内部構造:アプリケーションを Service Weaver に 対応させるためのコードジェネレータ (エンコーディングやスタブなどの生成)

Slide 19

Slide 19 text

Application 分散させて実行 Rock Paper Scissors Scissors Rock Paper type Rock interface { … } type Paper interface { … } type Scissors interface { … } // Components … 相互に呼び出し合うコンポーネントの集合体 内部構造:アプリケーションを Service Weaver に 対応させるためのコードジェネレータ (エンコーディングやスタブなどの生成) モジュラー バイナリとして記述 ローカルで実行

Slide 20

Slide 20 text

Application // Cache component definition. type Cache interface { Put(ctx context.Context, key, value string) error ... } どうコンポーネントを定義するか? ● Go interface として定義

Slide 21

Slide 21 text

Application // Cache component definition. type Cache interface { Put(ctx context.Context, key, value string) error ... } // Cache component implementation. type cache struct { weaver.Implements[Cache] // to weavify the component data map[string]string } func (c *cache) Put(_ context.Context, key, value string) error { c.data[key] = value return nil } どうコンポーネントを実装するか? ● Go の構造体を定義 ● 実装を埋め込む weaver.Implements[T] どうコンポーネントを定義するか? ● Go interface として定義

Slide 22

Slide 22 text

Application // Cache component definition. type Cache interface { Put(ctx context.Context, key, value string) error ... } // Cache component implementation. type cache struct { weaver.Implements[Cache] // to weavify the component data map[string]string } func (c *cache) Put(_ context.Context, key, value string) error { c.data[key] = value return nil } /////////////////////////////////////////////////////////////////// type app struct { weaver.Implements[weaver.Main] // to make app the main component cache weaver.Ref[Cache] // to get a reference to Cache } インスタンス化、実行するには? ● weaver.Ref[T] は、コンポーネントへの ハンドルを返す どうコンポーネントを実装するか? ● Go の構造体を定義 ● 実装を埋め込む weaver.Implements[T] どうコンポーネントを定義するか? ● Go interface として定義

Slide 23

Slide 23 text

Application // Cache component definition. type Cache interface { Put(ctx context.Context, key, value string) error ... } // Cache component implementation. type cache struct { weaver.Implements[Cache] // to weavify the component data map[string]string } func (c *cache) Put(_ context.Context, key, value string) error { c.data[key] = value return nil } func main() { ctx := context.Background() // Run the app. err := weaver.Run(ctx, func(ctx context.Context, app *app) error { … } } /////////////////////////////////////////////////////////////////// type app struct { weaver.Implements[weaver.Main] // to make app the main component cache weaver.Ref[Cache] // to get a reference to Cache } インスタンス化、実行するには? ● weaver.Ref[T] は、コンポーネントへの ハンドルを返す ● weaver.Run(...) でアプリを実行する どうコンポーネントを実装するか? ● Go の構造体を定義 ● 実装を埋め込む weaver.Implements[T] どうコンポーネントを定義するか? ● Go interface として定義

Slide 24

Slide 24 text

Application // Cache component definition. type Cache interface { Put(ctx context.Context, key, value string) error ... } // Cache component implementation. type cache struct { weaver.Implements[Cache] // to weavify the component data map[string]string } func (c *cache) Put(_ context.Context, key, value string) error { c.data[key] = value return nil } func main() { ctx := context.Background() // Run the app. err := weaver.Run(ctx, func(ctx context.Context, app *app) error { cache := app.cache.Get() err := cache.Put(ctx, “mykey”, “myvalue”) … } } /////////////////////////////////////////////////////////////////// type app struct { weaver.Implements[weaver.Main] // to make app the main component cache weaver.Ref[Cache] // to get a reference to Cache } コンポーネントの呼び出し方は? ● シンプルなメソッド呼び出し インスタンス化、実行するには? ● weaver.Ref[T] は、コンポーネントへの ハンドルを返す ● weaver.Run(...) でアプリを実行する どうコンポーネントを実装するか? ● Go の構造体を定義 ● 実装を埋め込む weaver.Implements[T] どうコンポーネントを定義するか? ● Go interface として定義

Slide 25

Slide 25 text

Deployment

Slide 26

Slide 26 text

How to deploy? 単一バイナリをリリース

Slide 27

Slide 27 text

How to deploy? シンプルな設定ファイル ● バイナリを指定するだけ 単一バイナリをリリース [serviceweaver] binary = "./game" // Rock Paper Scissors app config.

Slide 28

Slide 28 text

How to deploy? [serviceweaver] binary = "./game" // Rock Paper Scissors app config. $ go run . # Run in a single process. シンプルな設定ファイル ● バイナリを指定するだけ 単一バイナリをリリース

Slide 29

Slide 29 text

How to deploy? [serviceweaver] binary = "./game" // Rock Paper Scissors app config. $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. シンプルな設定ファイル ● バイナリを指定するだけ 単一バイナリをリリース

Slide 30

Slide 30 text

How to deploy? [serviceweaver] binary = "./game" // Rock Paper Scissors app config. $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎

Slide 31

Slide 31 text

How to deploy? [serviceweaver] binary = "./game" // Rock Paper Scissors app config. $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. // Deployments config. [ssh] locations_file = "./ssh_locations.txt" 単一バイナリをリリース デプロイ コマンド for ● ローカル環境 ● 複数のマシン シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎

Slide 32

Slide 32 text

How to deploy? [serviceweaver] binary = "./game" // Rock Paper Scissors app config. // Deployments config. [ssh] locations_file = "./ssh_locations.txt" $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. 単一バイナリをリリース デプロイ コマンド for ● ローカル環境 ● 複数のマシン シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎

Slide 33

Slide 33 text

How to deploy? [serviceweaver] binary = "./game" [gke] regions = ["us-west1", "us-east1"] listeners.game = {is_public = true, hostname = "game.example.com"} // Deployments config. [ssh] locations_file = "./ssh_locations.txt" // Rock Paper Scissors app config. $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. 単一バイナリをリリース デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎

Slide 34

Slide 34 text

How to deploy? [serviceweaver] binary = "./game" // Deployments config. [ssh] locations_file = "./ssh_locations.txt" // Rock Paper Scissors app config. $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. [gke] regions = ["us-west1", "us-east1"] listeners.game = {is_public = true, hostname = "game.example.com"} 単一バイナリをリリース デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎

Slide 35

Slide 35 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎 デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境

Slide 36

Slide 36 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true resourceSpec: requests: memory: "64Mi" cpu: "250M" // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎 デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境

Slide 37

Slide 37 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true resourceSpec: requests: memory: "64Mi" cpu: "250M" scalingSpec: minReplicas: 2 maxReplicas: 12 // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎 デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境

Slide 38

Slide 38 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true resourceSpec: requests: memory: "64Mi" cpu: "250M" scalingSpec: minReplicas: 2 maxReplicas: 12 storageSpec: volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc volumeMounts: - name: my-volume mountPath: "/app/data" // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎 デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境

Slide 39

Slide 39 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true resourceSpec: requests: memory: "64Mi" cpu: "250M" scalingSpec: minReplicas: 2 maxReplicas: 12 storageSpec: volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc volumeMounts: - name: my-volume mountPath: "/app/data" // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. $ weaver kube deploy kube.yaml # Generates k8s deployment. 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎 デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境

Slide 40

Slide 40 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true resourceSpec: requests: memory: "64Mi" cpu: "250M" scalingSpec: minReplicas: 2 maxReplicas: 12 storageSpec: volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc volumeMounts: - name: my-volume mountPath: "/app/data" // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. $ weaver kube deploy kube.yaml # Generates k8s deployment. $ kubectl apply -f .yaml># Run in GKE, EKS, AKS, on-prem. 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎 デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境

Slide 41

Slide 41 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true resourceSpec: requests: memory: "64Mi" cpu: "250M" scalingSpec: minReplicas: 2 maxReplicas: 12 storageSpec: volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc volumeMounts: - name: my-volume mountPath: "/app/data" // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. $ weaver kube deploy kube.yaml # Generates k8s deployment. $ kubectl apply -f .yaml># Run in GKE, EKS, AKS, on-prem. Telemetry Prometheus Jaeger Grafana 単一バイナリをリリース シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎 https://github.com/ServiceWeaver/weav er-kube/tree/main/examples/telemetry デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境

Slide 42

Slide 42 text

How to deploy? appConfig: weaver.toml repo: docker.io/your_docker_id listeners: - name: game public: true resourceSpec: requests: memory: "64Mi" cpu: "250M" scalingSpec: minReplicas: 2 maxReplicas: 12 storageSpec: volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc volumeMounts: - name: my-volume mountPath: "/app/data" // kube.yaml $ go run . # Run in a single process. $ weaver multi deploy weaver.toml # Run in multiple processes. $ weaver ssh deploy weaver.toml # Run in the cluster. $ weaver gke deploy weaver.toml # Run in GKE. $ weaver kube deploy kube.yaml # Generates k8s deployment. $ kubectl apply -f .yaml># Run in GKE, EKS, AKS, on-prem. Telemetry Prometheus Jaeger Grafana CI / CD Pipelines Cloud Build Argo CD Jenkins 単一バイナリをリリース デプロイ コマンド for ● ローカル環境 ● 複数のマシン ● カスタム GKE デプロイヤー ○ マルチリージョン ○ 安全なロールアウト(Blue/Green) ○ ルーティング ○ カスタム リソースの管理 ● 任意のマネージド K8s 環境 シンプルな設定ファイル ● バイナリを指定するだけ ● デプロイ毎

Slide 43

Slide 43 text

How is it deployed? component Rock component Paper component Scissors モジュラー バイナリ

Slide 44

Slide 44 text

How is it deployed? プロセス (Microservices と同義) component Rock component Paper component Scissors Rock Paper モジュラー バイナリ Scissors

Slide 45

Slide 45 text

How is it deployed? component Rock component Paper component Scissors Rock Paper weaver libraries アプリとランタイ ム間の相互作用 を管理 Scissors weaver libraries プロセス (Microservices と同義) モジュラー バイナリ

Slide 46

Slide 46 text

How is it deployed? component Rock component Paper component Scissors Rock Paper weaver libraries ランタイム Local, SSH, GKE, EKS, AKS, etc. デプロイヤー Scissors weaver libraries アプリとランタイ ム間の相互作用 を管理 プロセス (Microservices と同義) モジュラー バイナリ

Slide 47

Slide 47 text

Telemetry and Testing

Slide 48

Slide 48 text

可観測性の向上 func (c *cache) Put(_ context.Context, key, value string) error { c.Logger().Info(“Add”, “key”, key, “value”, value) c.data[key] = value return nil } ロギング ● 各コンポーネントにはそれぞれロガーが関連付けられています ● 構造化ログ:ログの閲覧、追跡、検索、フィルタリングが可能 $ weaver gke logs --follow $ weaver gke logs ‘app==“cache” && level==”info” $ … ...

Slide 49

Slide 49 text

可観測性の向上 var putCount = weaver.NewCounter(“put_count”, “Number of Put ops.”) func (c *cache) Put(_ context.Context, key, value string) error { c.data[key] = value putCount.Add(1.0) return nil } メトリクス ● カウンター、ゲージ、ヒストグラム ● フレームワーク メトリクスを含む ... ...

Slide 50

Slide 50 text

可観測性の向上 func main() { … // Create an otel handler to enable tracing. otelHandler := otelhttp.NewHandler( http.DefaultServeMux, “http”) http.Serve(lis, otelHandler) } トレーシング ● OpenTelemetry に依存 ● 有効にすると、すべての HTTPリクエストとコンポーネントのメソッド呼び出しが自動的に トレースされます ... ...

Slide 51

Slide 51 text

可観測性の向上 $ weaver gke profile cache # CPU profile. $ weaver gke profile –-type=heap cache # Heap profile. $ … プロファイリング ● 個々のプロセスをプロファイルし、単一のプロファイルに集約します ● アプリ全体のパフォーマンスを把握できます ... ...

Slide 52

Slide 52 text

Runners 異なる通信のランナーを提供 ● weavertest.Local ● weavertest.Multi ● weavertest.RPC Fakes コンポーネントの実装を stub で提供可 ● weavertest.Fake テストのサポート機能 import ( ... "github.com/ServiceWeaver/weaver" "github.com/ServiceWeaver/weaver/weavertest" ) type fakeClock struct { now int64 } func (f *fakeClock) Now(context.Context) (int64, error) { return f.now, nil } func TestClock(t *testing.T) { for _, runner := range weavertest.AllRunners() { fake := &fakeClock{100} runner.Fakes = append(runner.Fakes, weavertest.Fake[Clock](fake)) runner.Test(t, func(t *testing.T, clock Clock) { now, err := clock.UnixMicro(context.Background()) if err != nil { t.Fatal(err) } if now != 100 { t.Fatalf("bad time: got %d, want %d", now, 100) } }) } } ...

Slide 53

Slide 53 text

まとめ:冒頭の課題が解決されるか

Slide 54

Slide 54 text

理想 Plan Code Test Release Maintain Build Deploy 現実 Shift Left Plan Code Test Release Build Deploy 計画の長期化 テスト責務の肥 大化 オペレーションの 複雑化 Maintain インシデント対 応の長期化 Time Spent Platform Developer Roles inner loop の長期化 Developer の さらなる責務 【再掲】現実に見られるイノベーション能力の低下

Slide 55

Slide 55 text

計画から実装までのアジリティを高める モジュール化されたビ ジネスロジックを記述 Hybrid monolith Distributed monolith Microservices マイクロ サービスの 計画、実装、デプロイ Without Service Weaver Service Weaver モノリスの計画、 実装、デプロイ Deploy 開発の 抽象化

Slide 56

Slide 56 text

イノベーション能力を強化させる Hybrid monolith Distributed monolith Microservices Without Service Weaver Service Weaver 低レイテンシ、かつ モジュール性が高い gRPC, http, tcp gRPC, http, tcp 低レイテ ンシ モジュール 性が高い

Slide 57

Slide 57 text

製品の品質向上 Hybrid monolith Distributed monolith Microservices Without Service Weaver Service Weaver コンポーネント毎に 単体テストを 作成 ロジックをデバッグ 統合処理を実行 シミュレーション Local Staging サービス毎に 単体テストを 作成 サービス毎に 統合テストを 作成 E2E テストを実行 サービス毎に セットアップと 実行 サービス毎に セットアップと 実行

Slide 58

Slide 58 text

製品の品質向上 改善 Admin Developer Roles Plan Code Test Build Service Weaver Developer Maintain Deploy Plan Code Test Release Build Deploy 現実 Maintain 統合 QA デバッグ 実験、試作 欠陥とインシデントに 費やす時間を削減 包括的なローカル テストで、テストの 手間を軽減 Unit & Integration

Slide 59

Slide 59 text

最後に:Service Weaver で全て解決? 当たり前ですが、銀の弾丸ではありません マイクロサービス構成が悪いわけでもありません むしろ、マイクロサービス化がうまくワークすると、メリットの方が多いかも モジュラー モノリスで開発をスタートさせ、必要に応じて分離するのが良さそう 今後も機能改善、拡張が期待できる OSS なので、ぜひ触ってみてください

Slide 60

Slide 60 text

ちょっとだけ宣伝

Slide 61

Slide 61 text

すべての Google Cloud 開発者、技術者、学生のための メンバーシップ プログラム! 知る 多彩なコンテンツで 最新情報が学べる 高める 学習プログラムで スキルアップできる つながる キャリアや年齢を超えた 仲間と交流できる cloud.google.com/innovators ご登録はこちら メンバー特典 メンバー登録受付中! コミュニティ オンライン学習プラットフォーム「 Google Cloud Skills Boost 」を活用でき るよう、毎月 35 クレジットが無料で付与されます。

Slide 62

Slide 62 text

Innovators Live Japan デベロッパー・エンジニア向けのセッションを ライブ配信でお届け! https://goo.gle/GCI-LIVE-JP Google Cloud のメンバーやユーザーが、 Google Cloud やデベロッパー界隈で注目のトピックについて、トークを繰り広げます。 データベース・ データ分析・ AI/ML サーバーレス・コンテナ 監視・ オブザーバビリティ・ SRE Game Community スタートアップ ウェビナー ご登録はこちら