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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
今さら理解するウェブフォントver.2026
takanorip
3
660
hackers_champloo_2026_tidb
makocchi
0
110
「Docker Desktop不要の時代」は 来たのか?
ueponx
0
510
初対面のメンバーがチームを組み、Claude Codeでゼロからサービスをリリース
mkdev10
1
120
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.7k
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
予測不能な実行エージェントを安全にサクッと試せるサンドボックス環境の話
sansantech
PRO
1
140
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
170
OpenSharing について熱く語る〜AI アセットの共有について〜
kameitomohiro
0
260
子育てエンジニアの可処分時間が減っても成長を諦めない戦い方
sudoakiy
6
4.4k
パッチ更新でterraform initが落ちた日
grimoh
1
120
OR学会2026年秋期大会_機械学習と数理最適化の融合による、配合レシピ最適化システム開発事例
brainpadpr
0
130
Featured
See All Featured
Prompt Engineering for Job Search
mfonobong
0
500
Fireside Chat
paigeccino
43
4.1k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Automating Front-end Workflow
addyosmani
1369
210k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
4 Signs Your Business is Dying
shpigford
187
23k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
700
A designer walks into a library…
pauljervisheath
211
25k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
For a Future-Friendly Web
brad_frost
184
10k
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