Slide 1

Slide 1 text

⽊を⾒て森も⾒る モジュールが織りなすプロダクトの森 株式会社ナレッジワーク 宮⽥聖也 (@38xxer)

Slide 2

Slide 2 text

© Knowledge Work Inc. 2 • 宮⽥聖也 (38tter) • ソフトウェアエンジニア@ナレッジワーク • Golang, Ruby が好き • 趣味:🍺🍺🍺, ⚽ (󰧹, 󰎼), 🎸, 📷 ⾃⼰紹介

Slide 3

Slide 3 text

© Knowledge Work Inc. ナレッジワーク 製品紹介 3 みんなが売れる営業になる セールスイネーブルメントクラウド 現場担当者の営業支援をするプロダクト、 「ナレッジワーク」を提供しています

Slide 4

Slide 4 text

© Knowledge Work Inc. 事業の特徴 4 4 ①マルチプロダクト展開 ②エンタープライズ顧客 ③マルチテナント SaaS

Slide 5

Slide 5 text

© Knowledge Work Inc. 事業の特徴 5 5 複数のプロダクト展開により シナジーを産み競合優位を築く 従業員数1000 ⼈以上の ⼤企業に限定して提供 顧客企業ごとテナントを作成

Slide 6

Slide 6 text

© Knowledge Work Inc. go を使ったモジュラーモノリス開発 6 6 モジュール化✖モノリス

Slide 7

Slide 7 text

© Knowledge Work Inc. アーキテクチャの概観 7 7

Slide 8

Slide 8 text

© Knowledge Work Inc. アーキテクチャの概観 8 8 CRUD処理 ファイル操作 並⾏処理 共通⾔語で書ける

Slide 9

Slide 9 text

© Knowledge Work Inc. アーキテクチャの概観 9 9 複数のプロダクトに共通する ドメインを共通機能として 切り出す

Slide 10

Slide 10 text

© Knowledge Work Inc. アーキテクチャの概観 10 10 依存関係の順序は プロダクト→共通機能 デプロイ順序も固定

Slide 11

Slide 11 text

© Knowledge Work Inc. アーキテクチャの概観 11 11 Cloud Run アプリケーション 間は Connect で通信

Slide 12

Slide 12 text

© Knowledge Work Inc. アーキテクチャの概観 12 12 依存関係を逆転させるとき e.g. ファイル処理完了の通知

Slide 13

Slide 13 text

© Knowledge Work Inc. おさらい:事業の特徴 13 13 ①マルチプロダクト展開 ②エンタープライズ顧客 ③マルチテナント SaaS

Slide 14

Slide 14 text

© Knowledge Work Inc. ミニサービス 14 14 ミニサービス ● Go のバイナリ on Cloud Run ● 独⽴なモジュールの集まり

Slide 15

Slide 15 text

© Knowledge Work Inc. ミニサービス 15 15 ミニサービス ● Go のバイナリ on Cloud Run ● モジュールの集まり モジュール ● ドメイン単位の境界 ● 同⼀トランザクション内で扱う集約 ● 再利⽤可能 ○ サービス内では import ○ サービス外からは RPC 呼び出し コンテンツサービス ナレッジモジュール 画像モジュール ナレッジ推薦モジュール ナレッジ検索モジュール …

Slide 16

Slide 16 text

© Knowledge Work Inc. ミニサービス 16 16 ミニサービス ● チームの責任範囲の境界 ● 「ミニサービスAはチームX、ミニサービス BはチームYの持ち物」のような認識 ● 他のチームのミニサービスを触ることもし ばしばある ○ e.g. 共通基盤へのモジュール追加 コンテンツ ナレッジモジュール 画像モジュール ナレッジ推薦モジュール ナレッジ検索モジュール …

Slide 17

Slide 17 text

© Knowledge Work Inc. モジュール 17 17 モジュール ● レイヤーごと責務を分けている ハンドラ ● connect PRC のハンドラ ● protoc-plugin でコード⽣成を活⽤ ○ API の権限管理 モジュールサービス ● ビジネスロジックの記述 ● 更新系‧参照系の I/F を分けている ○ CQRS アダプタ ● データアクセス ● ORM は Gorm ナレッジモジュール ハンドラ モジュールサービス アダプタ

Slide 18

Slide 18 text

© Knowledge Work Inc. ミニサービスのディレクトリスタイル 18 18 product/example ├── CODEOWNER ├── README.md ├── backend │ ├── backend_config.cue │ ├── deploy │ ├── script │ │ └── run-local.sh │ └── src │ ├── cmd │ ├── go.mod │ ├── go.sum │ └── server ├── deploy ├── local │ ├── README.md │ └── envfiles │ └── definitions ├── product_config.cue ├── proto │ ├── gen │ │ ├── go.mod │ │ ├── go.sum │ │ └── product │ ├── proto │ │ └── product │ ├── protoevent │ │ └── product │ └── protosdk │ └── product └── tf ├── build └── core ディレクトリスタイルが決まっている ● バックエンド開発のボイラープレート 全部⼊り ● フロントエンド‧バックエンド実装 ● IaC 定義 ○ terraform ● APIスキーマ定義 ○ buf ● デプロイスクリプト ○ knative ○ skaffold ○ gcloud ● …etc. 新規プロダクト開発時のスターターキット

Slide 19

Slide 19 text

© Knowledge Work Inc. デプロイフロー 19 19 ミニサービス単位でデプロイ可能 ● 開発者が⾃発的にできる ⽅法はいくつかあり環境により異なる ● 検証環境では GitHub Actions で ○ 特定ブランチへのマージトリガー ○ IssueOps ● 本番環境では Cloud Deploy の ○ DeliveryPipeline 共通機能とプロダクトの依存関係の注意は必要

Slide 20

Slide 20 text

© Knowledge Work Inc. DB マイグレーション 20 20 product/example ├── CODEOWNER ├── README.md ├── backend │ ├── backend_config.cue │ ├── deploy │ ├── script │ │ └── run-local.sh │ └── src │ ├── cmd │ ├── go.mod │ ├── go.sum │ └── server ├── deploy ├── local │ ├── README.md │ └── envfiles │ └── definitions ├── product_config.cue ├── proto │ ├── gen │ │ ├── go.mod │ │ ├── go.sum │ │ └── product │ ├── proto │ │ └── product │ ├── protoevent │ │ └── product │ └── protosdk │ └── product └── tf ├── build └── core sql-migrate ● go 製マイグレーションツール ● sql ファイルでスキーマ管理 ● DB migration は Application deploy と 分離 マルチテナントのデータ分離が必須 ● PostgreSQL の⾏レベルのデータ分離 ○ Raw Level Security ● GitHub Actions で lint 実⾏し以下を保証 ○ RLS 有効 ○ Row Security Policies の作成

Slide 21

Slide 21 text

© Knowledge Work Inc. アーキテクチャの恩恵を受けた点 21 21 ①新規開発の初速・品質の担保 ②高い再利用性によるスケーラビリティ

Slide 22

Slide 22 text

© Knowledge Work Inc. 新規プロダクト⽴ち上げが⾼速‧省⼒化 22 22 ディレクトリスタイル=スターターキット モジュール=ビルディングブロック

Slide 23

Slide 23 text

© Knowledge Work Inc. 新規開発の初速‧品質の担保 23 23

Slide 24

Slide 24 text

© Knowledge Work Inc. ミニサービス 24 24 コンテンツ ナレッジモジュール 画像モジュール ナレッジ推薦モジュール ナレッジ検索モジュール …

Slide 25

Slide 25 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 25 25 通常のファイル処理

Slide 26

Slide 26 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 26 26 通常のファイル処理 LLM によるファイルコンテンツの要約処理を追加する

Slide 27

Slide 27 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 27 27 LLM によりファイルコンテンツの要約処理を追加する 顧客の業種によっては NG →テナント単位で要約機能の ON/OFF が必要

Slide 28

Slide 28 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 28 28 LLM によりファイルコンテンツの要約処理を追加する 顧客の業種によっては NG →テナント単位で要約機能の ON/OFF が必要 コンテント処理系はセキュリティ都合で隔離されているべき

Slide 29

Slide 29 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 29 29 LLM によりファイルコンテンツの要約処理を追加する 顧客の業種によっては NG →テナント単位で要約機能の ON/OFF が必要 コンテント処理系はセキュリティ都合で隔離されているべき→共通基盤に問い合わせは NG ❌

Slide 30

Slide 30 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 30 30 共通基盤バックエンドでコンテンツ処理終了を検知 要約機能が有効なテナントであれば要約タスク実⾏

Slide 31

Slide 31 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 31 31 新規テナントでファイル⼀括登録 →同じテナントからの⼤量のリクエストにより LLM API の quota が逼迫する →他のテナントからのリクエストを受け付けられない時間が発⽣

Slide 32

Slide 32 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 32 32 🤔🤔🤔…

Slide 33

Slide 33 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 33 33 コンテンツ処理に同様の課題を解決する仕組みがあった →リクエストをテナントごとに公平に差配するタスクキュー

Slide 34

Slide 34 text

© Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 34 34 コンテンツ処理系に同様の課題を解決する仕組みがあった →リクエストをテナントごとに公平に差配するタスクキュー →コンテンツ処理系に閉じず、モジュール化されており再利⽤可能

Slide 35

Slide 35 text

No content