Souzoh Tech Talk #01: Monorepo

2021/08/25に公開

概要

2021/08/18に開催された下記勉強会のメモです
https://mercari.connpass.com/event/221976/

https://www.youtube.com/watch?v=xaaJVs5P630

パネルディスカッション

技術スタックについて
https://engineering.mercari.com/blog/entry/20210810-mercari-shops-tech-stack/

monorepo

  • 大量のマイクロサービスがある
    • multi repoでは全量が把握しにくいい
    • 今まではサービスごとに作ってた
  • 言語でディレクトリを分けたのが特徴
    • まだいいのかはわからない
    • 言語ごとに役割が分担されてるのでいいのかも
  • 満足度は高い
  • メルカリでmonorepoの採用事例はそんなにないけど最近ちょっとずつ流行りつつある

monorepoと言語の相性

  • Go
    • monorepoだから困ったところはない
    • toolchain
      • Bazel/Gazelleがやってくれるので慣れればいける
    • デプロイは依存関係意識しないといけない
      • monorepoだけどプロジェクトで別々にデプロイするので
    • BazelもGoもgoogleなので相性は良い
  • Typescript
    • パッケージマネージャーはyarn
    • monorepoを管理するための機能が揃ってきているので相性はいい
    • ビルドのtoolchain何使うか
      • Bazelの相性良くない
        • workspace対応してない
        • やめるかみたいな話ある
        • Lerna?
  • Python
    • 使い方次第ではあるが、そんなに良くないかも?悩み中
    • 苦戦した
      • パス問題でハマった
      • gunicornでどう起動するなど?
    • Pantsとかもある
  • toolchain
    • 揃えたいが、各言語のツールチェインを使うみたいな話もある
    • Bazelにこだわっているわけでもない
    • Typescriptは諦める方向でいきそう
      • workspace使わなければいける
    • Earthlyとかもあり?

https://bazel.build
https://lerna.js.org
https://www.pantsbuild.org
https://earthly.dev

monorepoと共通化

  • 処理をどこまで共通化しているのか?
    • 現状だとあまり共通化していない
    • 認証、ログは共通のパッケージある
      • 他には外部サービスと通信するところなど
  • 共通化によるデメリットは?
    • 個別の用件が挟まるものはそれぞれのサービスで
    • 同じようなの書いてたら共通化する

monorepoの良いところ

  • マイクロサービスとの相性
    • リファクタリングやりやすい
  • 一つのリポジトリなので変化がわかる
    • 可視性
  • 共通化が楽、やりやすい
  • マイクロサービス増やしやすくなる
    • またがるやつをまとめて修正できる
    • デプロイ楽

monorepoの課題/懸念

  • コードのOwnershipが明確でなくなる
  • コードの保守性低下
  • deploy時の依存関係
  • 共通化をどこまでやるか
  • マイクロサービスが増えていったら
    • ローカル環境どうする?
    • docker-composeで起動は辛くなる
  • Bazel
    • 躓く場所が多い
      • 導入するなら覚悟が必要
      • ちょっと入れてみるかで痛い目を見る
    • 機能したときの素晴らしさはある

質疑

  • protoの生成ファイルはコミットしてる?
    • なるべくコミットしない
  • マイクロサービス全員で見てる?
    • どちらかというと制限を設けていないという感じ
    • ある程度自然に決まっている

Discussion