Slide 1

Slide 1 text

『毎日の移動』を支えるGoバックエンド内製開発 都市生活を豊かにする開発へ URBAN HACKS 東急線アプリチーム バックエンドエンジニア 宇都木 勇太

Slide 2

Slide 2 text

2 自己紹介 URBANHACKS 東急線アプリチーム バックエンドエンジニア 宇都木 勇太 ● 前職はアドテク領域 ● 東急線アプリ開発を担当 ● 初めてのGo言語 ● Goバックエンド内製開発の立ち上げから改善まで ● 最近はAIを使った開発プロセス刷新にも挑戦中

Slide 3

Slide 3 text

3 URBAN HACKSと東急線アプリについて

Slide 4

Slide 4 text

4 東急線アプリについて ● リニューアル日: 2022年9月29日 ~ ● バックエンド技術・環境 ○ Go ○ Typescript / Next.js / Strapi ○ Docker / Github ○ Firebase / Google Cloud https://ii.tokyu.co.jp/tokyusenapuri

Slide 5

Slide 5 text

5 今日話すこと ● 東急線アプリリニューアルのGoバックエンド内製開発の歩みと課題 ● 直面した課題・改善の事例 ● 今後の展望 2022/3 ~ 2022/9/29 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生

Slide 6

Slide 6 text

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 誕生

Slide 7

Slide 7 text

7 リリース ● アプリバックエンドの刷新 ● お知らせ配信基盤の内製化 ● 内製システムと外部ベンダーシステム統合に よる価値最大化 2022/9/29 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生

Slide 8

Slide 8 text

8 リニューアル後すぐの試練 ● 大規模なトラフィック集中 ● Goのパフォーマンスへの信頼度の高まり ● 交通インフラの’リアル’のダイナミズム 当時のGoogle Cloud コンソールのキャプチャ 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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 } ハンドラ処理でコネクションプール作成 ハンドラ処理外で一度だけコネクションプール作成

Slide 11

Slide 11 text

11 新横浜線開通対応 ● 新横浜線開通と同時にアプリリリース ● 司令所シミュレーターでテスト ○ 外部ベンダーのエンジニア + 自分 + 電鉄の方 nano bananaで生成した司令所のイメージ図です HPより: https://www.tokyu.co.jp/special/chokutsusen/ 開通前工事中の駅を視察した時の写真 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 2023/3/11 UH 誕生

Slide 12

Slide 12 text

12 TOQCOIN新規開発 ● 乗車するとポイントがたまるサービス ● TOKYUIDの導入 ● 基盤チーム & 新たな外部ベンダーAPIとの連携 2024/10/21 現在 PJ始動 リリース TOQCOIN 新横浜線 UH 誕生

Slide 13

Slide 13 text

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/

Slide 14

Slide 14 text

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 取引先が増える ごとにファイル を分離していく 外部通信まわり の処理を集約

Slide 15

Slide 15 text

15 現在のGoバックエンド 実装機能抜粋 ● 電車時刻表 ● 列車走行位置 ● バス時刻表 ● バス接近情報・走行位置 ● 運行情報お知らせ・Push配信基盤 ● TOKYU ID連携 ● TOQCOIN(ポイントサービス)基盤 ● TOQCOIN Q SKIP連携 ● TOQCOIN Q SEAT連携 × 15 コンテナ × 22 コンテナ Job Web API Google Cloud Cloud Run 上で稼働 (コンテナフルマネージドサービス)

Slide 16

Slide 16 text

16 これから ─ AIの波 ● Las Vegas出張 Google Cloud Next ● AIコーディングツールの導入 ● 開発プロセス・開発体制の刷新 チームで取り組んでいる AIを使った開発プロセス改善資料の一部 Coding Agentのセッション ラスベガスの空港にて

Slide 17

Slide 17 text

17 最後に - URBAN HACKSで働く魅力・文化 ● エンジニアによるまちづくり ● ユーザー目線と技術力 ● 失敗を恐れない

Slide 18

Slide 18 text

No content