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
140
Other Decks in Technology
See All in Technology
Jev の中身は50行で再現できる。でも本物との差はどこにあるのか
hisuzuya
0
280
ひとりで始めた AI駆動開発、チームに広げて何が変わったのか
kenichiodo
1
210
複雑な業務システムを高速でつくるため、チーム全員をつくれる人へ
ayakurabuchi
0
120
バイブコーディングの特徴と「コケて直す」ループ
happysamurai294
0
140
Systems Manager AgentがインストールされたPCを紛失した時の対策を考えてみた
amarelo_n24
1
110
E2Eってつらくないですか?E2Eの管理コストを下げる手段とその実践
akaboshinit
6
2.9k
クラウドエージェントの先駆け Devin。今も最先端を走る、他との違い
kinopeee
1
540
ALBのLCU予約とトラフィックの波によるプロダクト理解 / Understanding ALB LCU and Traffic Spikes
mito201
1
130
Vue で書く 空間コンピューティング、TresJS と WebXR を使ったXR デバイスのフロントエンド開発
hiranuma
0
150
"AWSはちょっと苦手"でも大丈夫。AWS Blocks で手軽に作る Flutter のバックエンド #FlutterKaigi
tacck
PRO
0
120
Technical Project Manager の役割とやりがい、少しだけ AI
yoshiiryo1
0
550
AI時代の開発はウォーターフォールに回帰する? / development-with-ai-back-to-wf
okamototakuyasr2
0
170
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
570
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
650
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
Designing Powerful Visuals for Engaging Learning
tmiket
1
630
Paper Plane
katiecoart
PRO
5
54k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
410
Large-scale JavaScript Application Architecture
addyosmani
516
110k
So, you think you're a good person
axbom
PRO
2
2.2k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.6k
Side Projects
sachag
456
43k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
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