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

エンジニアがドメインロジックに 集中するためのコアパッケージ整備 / freee prepare a core package for microservice

Makoto Shiga
January 21, 2020

エンジニアがドメインロジックに 集中するためのコアパッケージ整備 / freee prepare a core package for microservice

Makoto Shiga

January 21, 2020
Tweet

More Decks by Makoto Shiga

Other Decks in Technology

Transcript

  1. • 新卒はソシャゲバックエンド ( Perl )
 • 2社目アニメ関係の会社でレガシーシステムの AWS移管など
 • 2017年8月

    freeeにjoin
 ◦ サービス基盤チーム
 ◦ スピード改善と負債返却が好き
 ◦ 最近はデッドコードを殲滅させる方法を考えて る
 
 Shiga Makoto / @MacoTasu 志賀 誠
 freee株式会社 / サービス基盤 / エンジニア
 2
  2. 14 マイクロサービス化を経て
 • Pros
 ◦ モノリシックな開発のときに抱えていた問題が解決 ◦ 同時並行で複数のマイクロサービスの開発が進み、それぞれで知 見が溜まった •

    Cons
 ◦ 各チーム間でノウハウの共有がうまくいかずに、ミドルウェア周りの 整備の工数が増えていた ◦ 微妙に構成が違うサービスが生まれた
  3. 21 調査段階で気にした点
 • 外部パッケージはGoらしい作りになっているか
 ◦ contextを受け取れる場合、中継し後ろに渡している ◦ 異常系のときはerrorを返す、panicは致命的な問題だけ ◦ goroutine

    safeな作りになっているか ◦ goのエコシステムを利用しているか ▪ golint, go vet… • 開発がアクティブであるか、スター数、今後の展望など

  4. 28 拡張性: HealthCheck pkgの例
 // Checker wraps the CheckHealth method.

    type Checker interface { CheckHealth(strict bool) error } type entry struct { checker Checker } // Service provides health check HTTP handlers. type Service struct { entries []entry } // Add appends for Checker. func (s *Service) Add(name string, c Checker) { // … appends Checker into entries. } 
 // CheckReadiness returns error if any checker is unhealthy. func (s *Service) CheckReadiness(strict bool) error { for _, e := range s.entries { if err := e.checker.CheckHealth(strict); err != nil { ... } } return nil } 
 

  5. Injector
 34 DB package • Providerを組み合わせて依存関係を解決し、特定の型を返す
 Injector.go config package 接続情報

    DBを使う Server package wire_gen.go Providerを並べる
 wire genコマンド実行
 DBコネクションを持つServer のオブジェクト生成するコード を生成

  6. 47 例: エラー通知
 • エラーはBugsnagに通知する
 • projectは基本各サービス単位
 • 環境がわかるようにステージを作成する
 ◦

    検証環境のみタグ名で判別する • severityを適切に設定する
 • 発生したら通知を受けて即対応、平常時は0
 • サービスに関するmetadataの情報と、追加の情報を設定できるように する
 • WARN, ERRORはSlackなどに通知すること