Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
はてなのサービスを支えるGo / hatena.go #1 maku693
Search
HAMADA Shota
January 31, 2024
Technology
4.9k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
はてなのサービスを支えるGo / hatena.go #1 maku693
hatena.go #1
の登壇資料です。
HAMADA Shota
January 31, 2024
More Decks by HAMADA Shota
See All by HAMADA Shota
趣味としてのゲーム開発 - 個人開発のモチベーションを保つ方法 / 湘.なんか #1
maku693
0
130
Other Decks in Technology
See All in Technology
購入ドメインでの課題と取り組み
ykagano
0
150
AI時代のPRレビューにどう向き合うか?
kairim0
1
110
自分で立ててみるLLMサービス
y_sera15
0
150
3つのアプローチで目指す チームを強くするAI駆動開発
thkt
0
140
並行性の問題を防げ!実践トランザクション入門
occhi
0
280
自作バイナリを動かす「入口」8選
puhitaku
1
1.2k
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
350
不可逆な意思決定を避けながら10億超の顧客データを AI Ready にするデータ基盤設計
baseballyama
1
240
使いこなすために知っておきたい Azure SRE Agent アンチパターン
torumakabe
2
430
go-sqletch
moznion
0
120
Incremental HTTP
kazuho
5
2.1k
LocalStack を使ったサーバーレスアプリケーション開発 / Serverless Development with LocalStack
kakakakakku
1
330
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
GitHub's CSS Performance
jonrohan
1033
470k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
390
YesSQL, Process and Tooling at Scale
rocio
174
15k
Ethics towards AI in product and experience design
skipperchong
2
420
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
580
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
620
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
930
Transcript
はてなのサービスを支える Go はてなにおけるGo利用のこれまでとこれから 濵田祥太 / id:maku693 hatena.go #1
自己紹介 • 濵田祥太 id:maku693 • 好きな言語:Go, JavaScript • 認定スクラムマスター
今日お話しすること • はてなとGoの関わり • はてなのGo製Webアプリケーションの構成と それに対する考察 • 現状の課題と今後の展望
はてなとGoの関わり
• Go 1.1 • 社内で初めてA Tour of Goを題材にした勉強 会が行われた記録がある 2013年
• Go 1.3 • Mackerelリリース • Mackerel-AgentにGoが採用 ◦ プロダクションにおける初採用 2014年
2015~2016年 • Go 1.5 ~ 1.7 • MackerelのサブシステムでGoが採用されは じめる •
Mackerel以外にも徐々に利用が広まる ◦ 社内むけコマンドラインツール ◦ はてラボ人間性センター
• Go 1.8~1.11 • Mackerelの時系列DBがGoで書かれたものに リプレース • Mackerel以外のサービスのサブシステムで プロダクション投入されはじめる ◦
はてなブックマーク ◦ はてなブログ 2017~2018年
• Go 1.12~1.15 • カクヨム ◦ 一部サブシステムをGoでマイクロサービスとして 実装 • はてなブログ
タグ ◦ 内部APIの実装言語として採用 2019~2020年
• Go 1.16 ~ 1.21 • マンガノ ◦ SPA/BFF向けGraphQL APIをGoで実装
• はてなのサービス基盤でGoが採用される • チーム横断組織「Goサブ会」発足 2021~2023年
• 現在はてなでは新しいシステムを開発する際 はPerl以外の言語を使うことを推奨 • Goで書かれたアプリケーションも多数開発・ 運用中 そして現在
はてなにおけるGo利用の歴史 • Mackerelでは10年ほど前から利用 • プロダクションでWebアプリケーションに 採用され始めたのは5年ほど前から
はてなのGo製 Webアプリケーションを 俯瞰してみる
はてなのGo製Webアプリケーション • 今回は主にWebアプリケーションの話を します ◦ 観点を絞るため ◦ 全て稼働中のサービス ◦ コード規模は数千行〜数万行
はてなのGo製Webアプリケーション • ここでいうWebアプリケーション ◦ 比較的長命なプロセス(サーバ) ◦ HTTPなどでクライアントからリクエストを 受け取り、レスポンスを返す ◦ データストアにデータを保存したり、データを取得
したりする
パッケージ構造
• usecase, service, repository, domain…と いった層があるパターン ◦ ビジネスロジックがそれ以外に依存しないように ◦ 依存関係の方向が意識されている
レイヤード
• 層がないパターン ◦ いわゆるインフラ層やリポジトリ層がそのまま露出・ 直接利用されているようなイメージ フラット
ライブラリ
• Go Modules ◦ 過去depなどを使っていたシステムは移行した 依存管理
• wire or なし • レイヤード構成にすると自然とDI的な仕組み が欲しくなる ◦ interfaceを使って抽象に依存すると、具体的な実装 を注入する必要が出てくる
DI
• testify, gotest.tools, ginkgo, なし(標準 testパッケージのみ) • 何かしらアサーション系のライブラリを入れ ていることがほとんど ◦
t.Fail()を何度も書く手間を省く ◦ BDDっぽい書き方は流行っていない テスト
• gomock or モックなし • レイヤード構造を採用しているサービスの多 くでgomockを利用 • 手書きしている例はあまりない モック
ロガー • zap, logrus、標準log, slog • 構造化ログが基本 ◦ 運用中の調査に便利 ◦
クラウドサービスプロバイダの対応が充実
HTTPサーバ • 標準net/http, echo, go-chi, gin • http.ServeMuxのみだと機能不足 ◦ ほとんどのシステムでルーターやミドルウェアが必要
• GraphQL ◦ gqlgen, graphql-go ◦ ほぼ全てgqlgen • gRPC ◦
システム間通信に採用 • OpenAPI ◦ go-swagger, oapi-codegen • スキーマファースト ◦ クライアントを自動生成できる ◦ 分業しやすい API
DBアクセス • sqlx ◦ RDBを使うシステムではほぼ間違いなく入っている ◦ ORMやクエリビルダが不要な場合のデフォルトの選択肢 • クエリビルダ ◦
goqu, squirrel • ORM ◦ gorm, sqlboiler, ent • ORMよりクエリビルダの採用例が多い ◦ PerlでTengよりSQL::Makerがよく使われていたのに似ている
考察
• エントリポイント (main) が複数あるサービスはほぼ レイヤード ◦ 複数エントリポイントから共通のユースケースを利用するのに 必要 ◦ フラットな場合ユースケースの置き場所が自明でない
• フラット構造の場合はDIがなくてもなんとかなるが… ◦ これもエントリポイントが増えてくると初期化処理が重複して しまう パッケージ構造
ライブラリ選定 • リフレクションよりコード生成が人気 ◦ wire, gomock, gqlgen, oapi-codegen, ent, etc…
◦ 独自のジェネレータを自作している場合も • 重厚なフレームワークより軽量なライブラリ の組み合わせ
Goを採用してよかったこと • 陳腐化しづらい ◦ 基本的に言語のバージョン間の後方互換がある ◦ ライブラリは公開されている限りそのまま使い続け られる ◦ バージョンアップが楽
▪ サービスを長生きさせる前提の技術選定
現状の課題
• 人気のライブラリはあるがリポジトリ間で 微妙な差異がある • パッケージ構造についても同様 • 同じチーム内でも全く同じということがない ◦ リポジトリレベルで試行錯誤されている 定番構成が定まっていない
定番構成が定まっていない • ライブラリの探索が不十分 ◦ Graceful shutdown毎回手書きしてない? ◦ エラーにスタックトレースがないけどどうしたら? ◦ ORMどれ使ったらいいの?
◦ 設定ってどうやって読むのがベスト?
定番構成が定まっていない • パッケージの切り方のガイドラインがない ◦ どの層をなんと名づけてどこに置いたらよい? ▪ domain? usecase? repository? infra?
etc…
定番構成が定まっていない • 既存の実装を参考にするか、自分で考える しかない ◦ 断片化による認知負荷増・知識のポータビリティ低下 ▪ せっかく複数チームでGoを使っているのに知見を配れない ◦ リードタイムに影響する
▪ できるだけ技術選定以外のことに時間を使いたいはず ▪ 同じ問題を何度も解く意味はない
定番構成を決める動き • Goサブ会で標準化を進めている ◦ 発散から収束へ ◦ 今後GoでWebアプリケーションを作る際の デファクトスタンダードを用意
標準化 • 定番ライブラリの選定・実装 • Webアプリケーション向けのテンプレートリ ポジトリ作成 • https://speakerdeck.com/stefafafan/introductio n-to-the-go-task-force
まとめ
まとめ • はてなではGoをよく使っています ◦ あなたが今日押したボタンの裏でもGoが動いているか も… • 今までの利用実績をまとめ、社内スタンダー ドを決めつつあります
紹介したライブラリ • DI ◦ https://github.com/google/wire • テスト ◦ https://github.com/stretchr/testify ◦
https://github.com/gotestyourself/gotest.tools ◦ https://github.com/onsi/ginkgo • モック ◦ https://github.com/uber-go/mock • ロガー ◦ https://github.com/uber-go/zap ◦ https://github.com/sirupsen/logrus • HTTPサーバ ◦ https://github.com/labstack/echo ◦ https://github.com/go-chi/chi ◦ https://github.com/gin-gonic/gin
紹介したライブラリ • API ◦ https://github.com/99designs/gqlgen ◦ https://github.com/graphql-go/graphql ◦ https://github.com/grpc/grpc-go ◦
https://github.com/go-swagger/go-swagger ◦ https://github.com/deepmap/oapi-codegen • DB ◦ https://github.com/jmoiron/sqlx ◦ https://github.com/doug-martin/goqu ◦ https://github.com/Masterminds/squirrel ◦ https://github.com/go-gorm/gorm ◦ https://github.com/volatiletech/sqlboiler ◦ https://github.com/ent/ent