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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Don't write the architecture only in the prompt.
neohsu
0
290
You Have Agency(サンキュー、Ruby)
snoozer05
PRO
5
640
ひとりで始めた AI駆動開発、チームに広げて何が変わったのか
kenichiodo
1
210
GitHub、使う?使わない?
happysamurai294
0
140
OneLakeをデータソースにした AI Search(Foundry IQ)の ライフサイクル管理
ryuseiiida
0
220
Technical Project Manager の役割とやりがい、少しだけ AI
yoshiiryo1
0
550
AIテスト自動化と評価駆動開発EDD
happysamurai294
0
130
2拠点SRE活動始めてみた | sogaoh's LT @ ホンマでっかSRE勉強会 #3
sogaoh
PRO
0
230
書き手が人でもAIでも正しくなる道、SREを埋め込んだDeveloper Platform / tech drivers day8
chmikata
4
890
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
3
320
バックオフィスに染み出すTypeScript ── clasp で安全に仕組みを作る
nealle
1
160
SLOを阻む不安
sraku2159
0
200
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
590
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Git: the NoSQL Database
bkeepers
PRO
433
67k
A Soul's Torment
seathinner
8
3.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
600
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.6k
Between Models and Reality
mayunak
4
540
Accessibility Awareness
sabderemane
1
280
So, you think you're a good person
axbom
PRO
2
2.2k
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