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バックエンド内製開発
Search
yutautsugi
October 06, 2025
Programming
1.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
『毎日の移動』を支えるGoバックエンド内製開発
Findy登壇資料
https://findy.connpass.com/event/366591/
yutautsugi
October 06, 2025
Other Decks in Programming
See All in Programming
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
220
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
140
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5.2k
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
170
SREの越境 / SRE Collaboration
y0hgi
2
290
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
300
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
27
11k
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
100
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
550
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
360
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
140
Intent as Code
shoppingjaws
6
1.1k
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
A Soul's Torment
seathinner
8
3.7k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
510
It's Worth the Effort
3n
188
29k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
290
The Curious Case for Waylosing
cassininazir
1
540
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
66k
Designing Powerful Visuals for Engaging Learning
tmiket
1
580
Transcript
『毎日の移動』を支えるGoバックエンド内製開発 都市生活を豊かにする開発へ URBAN HACKS 東急線アプリチーム バックエンドエンジニア 宇都木 勇太
2 自己紹介 URBANHACKS 東急線アプリチーム バックエンドエンジニア 宇都木 勇太 • 前職はアドテク領域 •
東急線アプリ開発を担当 • 初めてのGo言語 • Goバックエンド内製開発の立ち上げから改善まで • 最近はAIを使った開発プロセス刷新にも挑戦中
3 URBAN HACKSと東急線アプリについて
4 東急線アプリについて • リニューアル日: 2022年9月29日 ~ • バックエンド技術・環境 ◦ Go
◦ Typescript / Next.js / Strapi ◦ Docker / Github ◦ Firebase / Google Cloud https://ii.tokyu.co.jp/tokyusenapuri
5 今日話すこと • 東急線アプリリニューアルのGoバックエンド内製開発の歩みと課題 • 直面した課題・改善の事例 • 今後の展望 2022/3 ~
2022/9/29 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生
6 Go導入・内製化スタート • 言語選定でGoの導入が決定 • クラウドはFirebase・Google Cloudを採用 • 選定したGoの主要ライブラリ ◦
echo ◦ gorm.io ◦ go-redis ◦ oapi-codegen ◦ go.opentelemetry.io ◦ cloud.google.com/go 当時のあれこれの一部。外部ベンダーとの結合を意識しながらの設計 2022/3 ~ 2022/9/29 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生
7 リリース • アプリバックエンドの刷新 • お知らせ配信基盤の内製化 • 内製システムと外部ベンダーシステム統合に よる価値最大化 2022/9/29
2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生
8 リニューアル後すぐの試練 • 大規模なトラフィック集中 • Goのパフォーマンスへの信頼度の高まり • 交通インフラの’リアル’のダイナミズム 当時のGoogle Cloud
コンソールのキャプチャ 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生
9 発生した課題 - Push通知 (リリース前) • 非機能要件: ◦ 運行情報を即時に同時配信 ◦
100万ユーザーを想定 • 負荷試験中にでた課題 ◦ Firestore SDKのTimeout ◦ 1Documentのサイズが大きい • ソリューション ◦ encoding/binaryを使って圧縮 ◦ 駅や路線の増減は滅多にないため { “mypage” { “push_setting”: { acceptance: true, … }, “spots”: [ {“name”: “三軒茶屋駅”}, …. ], ... } import “encoding/binary” type Filter struct { VersionByte uint8 Accept uint8 DayOfWeek uint8 Hour [3]uint8 Line [2]uint8 Station [19]uint8 } buf := []byte{...} rf := new(Filter) }} if err := binary.Read(buf, binary.BigEndian, rf); err != nil { return nil, err } Firestore ドキュメント(擬似) [0, 1, 0, 0, 0, 1, 1, 1] バイナリ化(擬 似) 圧縮 Unmarshal
10 発生した課題 - 高トラフィック状態(リリース後) • 発生事象: ◦ 遅延時などのPush配信でトラフィックが スパイクする ◦
メモリ使用量が加速度的に増加 ◦ 500エラー増加 • 原因 ◦ コネクションプールを過剰作成 ▪ Redis / Firestore • ソリューション ◦ シングルトン化 ▪ 通信クライアントライブラリのみ func main() { e := echo.New() e.GET("/users/:id", func(c echo.Context) error { ctx := context.Background() id := c.Param("id") fsClient, err := firestore.NewClient(ctx) if err != nil { return err } defer fsClient.Close() doc, err := fsClient. Collection("users"). Doc(id). Get(ctx) if err != nil { return err } var ( fsOnce sync.Once fsClient *firestore.Client ) func getFirestoreClient( ctx context.Context ) (*firestore.Client, error) { fsOnce.Do(func() { fsClient, fsErr := … }) return fsClient, fsErr } func main() { e := echo.New() e.GET("/users/:id", func(c echo.Context) error { ctx := context.Background() id := c.Param("id") doc, err := fsClient. Collection("users"). Doc(id). Get(ctx) if err != nil { return err } ハンドラ処理でコネクションプール作成 ハンドラ処理外で一度だけコネクションプール作成
11 新横浜線開通対応 • 新横浜線開通と同時にアプリリリース • 司令所シミュレーターでテスト ◦ 外部ベンダーのエンジニア + 自分
+ 電鉄の方 nano bananaで生成した司令所のイメージ図です HPより: https://www.tokyu.co.jp/special/chokutsusen/ 開通前工事中の駅を視察した時の写真 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生
12 TOQCOIN新規開発 • 乗車するとポイントがたまるサービス • TOKYUIDの導入 • 基盤チーム & 新たな外部ベンダーAPIとの連携
2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 UH 誕生
13 TOQCOINの拡大 • キャンペーン実施 • Q SKIPとの結合(企画乗車券とポイントを交換) • Q SEATとの結合
(有料座席券とポイントを交換) • その他絶賛企画中 現在 PJ始動 リリース TOQCOIN 新横浜線 UH 誕生 Q SKIPはスマートフォン1つで電車のフリーパスや施設の入場券等が購 入できて、使えるサービスです。東急電鉄とURBAN HACKSが共創して いるサービスです。 https://www.q-skip.tokyu.co.jp/ Q SEATは、東横線と大井町線において、夕方から夜間の帰宅時間帯に運 行している急行列車のうち1両を、有料座席指定専用の車両としてご利 用いただけるサービスです。 https://www.tokyu.co.jp/railway/ticket/q-seat/
14 発生した課題 • 課題 ◦ ポイント取引処理の複雑性 ◦ 口座API、QSKIP交換API、QSEAT交換APIを使う必要があ り、それぞれ仕様や連携先(別チーム・外部ベンダー)が 異なる
◦ 将来追加される交換先を見込んだ柔軟性 • ソリューション ◦ 取引とAPI呼び出しのPackageをカプセル化 ▪ 運行情報などでも外部通信周りの処理を集約させた callerパッケージを用意している • 結合先が多様なためドメイン処理と関心を分離 internal/exchangetransaction/ ├── exchange_facade.go ├── exchanger.go ├── qseat_exchanger_test.go ├── qseat_exchanger.go ├── qskip_exchanger_test.go └── qskip_exchanger.go internal/point-api/client.go internal/qskip-api/client.go internal/qseat-api/client.go 取引先が増える ごとにファイル を分離していく 外部通信まわり の処理を集約
15 現在のGoバックエンド 実装機能抜粋 • 電車時刻表 • 列車走行位置 • バス時刻表 •
バス接近情報・走行位置 • 運行情報お知らせ・Push配信基盤 • TOKYU ID連携 • TOQCOIN(ポイントサービス)基盤 • TOQCOIN Q SKIP連携 • TOQCOIN Q SEAT連携 × 15 コンテナ × 22 コンテナ Job Web API Google Cloud Cloud Run 上で稼働 (コンテナフルマネージドサービス)
16 これから ─ AIの波 • Las Vegas出張 Google Cloud Next
• AIコーディングツールの導入 • 開発プロセス・開発体制の刷新 チームで取り組んでいる AIを使った開発プロセス改善資料の一部 Coding Agentのセッション ラスベガスの空港にて
17 最後に - URBAN HACKSで働く魅力・文化 • エンジニアによるまちづくり • ユーザー目線と技術力 •
失敗を恐れない
None