Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
はてなのサービスを支えるGo / hatena.go #1 maku693
Search
HAMADA Shota
January 31, 2024
Technology
4.8k
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
現場に行くだけでは足りない——プロダクトエンジニアが業務の流れを捉える観点と、その鍛え方
takumiengineering
0
280
AI 駆動 Terraform 開発/SRE_BizReach_MIXI_2
visional_engineering_and_design
1
470
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
6
7.1k
[DroidKaigi 2026] Making UI specifications visible: Android UI development in the AI agent era supported by Compose Screenshot Testing and galleries
syarihu
0
570
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
3
2.2k
動画配信アプリでの Engage SDK 導入 — TVer Android が Play ストアにコンテンツを届けるまで
techtver
PRO
0
110
Bet AI Day 2026丨Agentは、「金融」という巨大産業の何を変えられるのか
layerx
PRO
0
780
Kiro Crewしか勝たん!?
miu_crescent
PRO
0
180
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
0
190
Nav2、Nav3 ... はたまた自作?〜 作って理解する Nav3 の設計意図 〜 / Nav2, Nav3 ... or Build Your Own? — Understanding Nav3's design intent by building it from scratch
yanzm
0
230
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
3
2.1k
書籍『生成AIの安全性入門』の入門
wataoka
0
210
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
290
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
660
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
510
Side Projects
sachag
455
43k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
410
Unsuck your backbone
ammeep
672
58k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
ラッコキーワード サービス紹介資料
rakko
1
4.7M
The SEO Collaboration Effect
kristinabergwall1
1
550
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