Upgrade to Pro — share decks privately, control downloads, hide ads and more …

木を見て森も見る-モジュールが織りなすプロダクトの森

 木を見て森も見る-モジュールが織りなすプロダクトの森

宮田聖也 (38tter) / 株式会社ナレッジワーク
※2025/05/13「Rails, Go, TypeScriptで挑む──バックエンド開発の選択と実践」での発表資料です
https://knowledgework.connpass.com/event/351615/

===セッション概要===
ナレッジワークは「みんなが売れる営業になる」をスローガンに、営業支援のプロダクトを複数展開しています。 また、昨今は生成AIのプロダクト統合を積極的に進めています。バックエンド開発では Go 言語を採用しています。 本発表では、Go を基盤としたマルチプロダクト展開のアーキテクチャを俯瞰し、内製コンテンツ処理システムや、生成AIのプロダクト統合への取り組みに焦点を当てつつ、チーム開発の実状をお話しします。

More Decks by KNOWLEDGE WORK / 株式会社ナレッジワーク

Other Decks in Technology

Transcript

  1. © Knowledge Work Inc. 2 • 宮⽥聖也 (38tter) • ソフトウェアエンジニア@ナレッジワーク

    • Golang, Ruby が好き • 趣味:🍺🍺🍺, ⚽ (󰧹, 󰎼), 🎸, 📷 ⾃⼰紹介
  2. © Knowledge Work Inc. ミニサービス 14 14 ミニサービス • Go

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

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

    • 「ミニサービスAはチームX、ミニサービス BはチームYの持ち物」のような認識 • 他のチームのミニサービスを触ることもし ばしばある ◦ e.g. 共通基盤へのモジュール追加 コンテンツ ナレッジモジュール 画像モジュール ナレッジ推薦モジュール ナレッジ検索モジュール …
  5. © Knowledge Work Inc. モジュール 17 17 モジュール • レイヤーごと責務を分けている

    ハンドラ • connect PRC のハンドラ • protoc-plugin でコード⽣成を活⽤ ◦ API の権限管理 モジュールサービス • ビジネスロジックの記述 • 更新系‧参照系の I/F を分けている ◦ CQRS アダプタ • データアクセス • ORM は Gorm ナレッジモジュール ハンドラ モジュールサービス アダプタ
  6. © 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. 新規プロダクト開発時のスターターキット
  7. © Knowledge Work Inc. デプロイフロー 19 19 ミニサービス単位でデプロイ可能 • 開発者が⾃発的にできる

    ⽅法はいくつかあり環境により異なる • 検証環境では GitHub Actions で ◦ 特定ブランチへのマージトリガー ◦ IssueOps • 本番環境では Cloud Deploy の ◦ DeliveryPipeline 共通機能とプロダクトの依存関係の注意は必要
  8. © 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 の作成
  9. © Knowledge Work Inc. モジュール化に救われた例:ナレッジの要約処理 28 28 LLM によりファイルコンテンツの要約処理を追加する 顧客の業種によっては

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

    NG →テナント単位で要約機能の ON/OFF が必要 コンテント処理系はセキュリティ都合で隔離されているべき→共通基盤に問い合わせは NG ❌