Slide 1

Slide 1 text

May 24, 2019 shuhei.ikeda Automotive BU. Smart Taxi Gr. DeNA Co., Ltd. DeNA.go #01 次世代配車アプリ「MOV」 Go事例紹介

Slide 2

Slide 2 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. ●Python 4年
 ●Ruby 2年
 ●C# / Erlang / Go1年
 
 MOV リリース1ヶ月後の2018年5月ごろに参加
 いまServerSideのTeamLeader
 
 自己紹介
 *

Slide 3

Slide 3 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. ●2018年 4月 神奈川県 地域限定でリリース
 ●2018年 6月 神奈川県 対象エリア拡大
 ●2018年 12月 東京都 リリース
 
 MOV
 *

Slide 4

Slide 4 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 
 Ruby から Go移行
 *

Slide 5

Slide 5 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. ●MOV server(2019/01 〜)
 - Go実装
 - WebAPI テストあり
 - 動作確認はChatOpsでE2Eテスト
 
 ●MOV server(〜 2018/4)
 - Ruby実装
 - WebAPI テストは一部のみ実装済み
 - 動作確認はPostman
 
 
 MOV SERVERを1年前と比較
 *

Slide 6

Slide 6 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. * システム構成
 
     before             after


Slide 7

Slide 7 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 
 Why Go?
 *

Slide 8

Slide 8 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. Rubyは開発者の生産性が高いとても良い言語ですが..
 
 圧倒的なサーバスピンアップ速度
 
 GAE/SE Goの圧倒的なサーバスピンアップ速度
 5分でアクセス数が10倍になるようなpush通知やTV放送といった爆発的なアクセス増加で も事前準備なしでアクセスを捌きるにはGAE/SE Goが最適だった。
 
 -> Go移行で達成できた
 
 
 メモリ効率の良さ
 
 prefork型Web serverでは達成できないメモリ効率の良さ
 
 -> goroutineでmany cpu server のリソースを使い切れる
 
 
 Why Go?
 
 *

Slide 9

Slide 9 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. どうやってRuby から Go に移行したかはtech blogに記載
 
 
 MOV タクシー配車アプリ RubyからGolangへ刷新 マイクロサービス化 https://engineer.dena.jp/2019/01/mov-rubygolang.html 
 * How
 


Slide 10

Slide 10 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 
 Go 事例紹介
 *

Slide 11

Slide 11 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. Vue.js + Express(GAE/SE Node.js) + GAE/SE Go
 Expressは環境切り替え、IP制限、JWT認証のため利用
 
 * 社内向け管理画面
 


Slide 12

Slide 12 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 試行錯誤した結果 UnitTestとhandlerのシナリオテストを書く方式に収束した。
 GAE のテスト高速化にはgithub.com/favclip/testerator を利用。
 
 
 
 
 
 
 
 
 * Test
 


Slide 13

Slide 13 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. API Documentの生成
 
 github.com/swaggo/swag を利用
 structからsample JSON含んだドキュメントを自動生成でき便利
 
 
 * 自動生成


Slide 14

Slide 14 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. Slack Bot 
 コマンドを共有しなくてもSlackのchat履歴から各エンジニアが学んでいくのが良い
 SlackのReal-Time Messaging APIを利用したbotを構築
 
 
 ▼ Slackから配車結合テストを実行した例
    成功時                  失敗時
 CHAT OPS
 *

Slide 15

Slide 15 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 
 負荷・障害に強いシステム実現に向けて
 *

Slide 16

Slide 16 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 exponential backoff 
 DB接続失敗時のリトライ間隔時間を失敗ごとに徐々に増やして行く。
 DB高負荷起因でAppサーバがスケールアウトしDBがコネクション数起因でDBが落ちるこ とを防ぐ。
 
 オートスケールするサーバでRDBを利用するなら入れておいて損はないと思います。
 
 
 
 
 負荷・障害に強いシステム実現に向けて1
 *

Slide 17

Slide 17 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 負荷検証の敷居を低く
 
 AWS EC2 + Locustで構築。1営業日あれば負荷が掛けれるようscript化
 少しでもリスクあると思ったら負荷検証できるよう敷居をとにかく低くしておく
 
 
 
 
 
 負荷・障害に強いシステム実現に向けて2
 *

Slide 18

Slide 18 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 fallback 実装
 
 サービス落とすより機能下げ縮退運転する
 投入ポイントの見極めが仕様次第で難しいですが刺さると緊急時の銀の弾丸に
 緊急シナリオごとにbizと縮退内容を握っておくとよりよい。
 
 - ETA(予想到着時間)システム高負荷で応答ないとき2点間直線距離で近似計算
 - 新システム投入初期段階はエラー時旧システムにfallback
 - 高負荷時に表示する車両台数を減らす
 
 
 
 負荷・障害に強いシステム実現に向けて3
 *

Slide 19

Slide 19 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 
 100倍速めざしてやっていくぞ
 *

Slide 20

Slide 20 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. bot, WebAPI, gRPCサーバでもシュッと書けてしまうGoの素晴らしさは既に各所で十分語られて いるため省略して..
 
 車両動態 のポーリングが重いので、gRPC with streaming APIで1サーバで捌ける同 時接続ユーザ数100倍目指してやっていくぞ。
 
 * ポーリングWebAPI の gRPC with streaming API化
 


Slide 21

Slide 21 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. * 現在
 


Slide 22

Slide 22 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. * 将来
 


Slide 23

Slide 23 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 
 PR
 *

Slide 24

Slide 24 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. High memory usage server in Golang メモリに乗り切らない膨大なマスタデータをGolang Serverで高速に効率よく扱うにはどうすれば 良いでしょうか。diskストレージからメモリへのデータ展開はprotobufを利用すると直接mapに変 換でき高速に処理できます。 更新されたdiskストレージ上のマスタデータをロック時間最小でメモリ展開するにはRead/Write ロックを組み合わせHot loadingする手法が有効です。 以上を地理空間データを扱った知見を抽象化して紹介します。 https://fukuoka.gocon.jp/ja/speakers/ikeda.sub/ * Go Conference'19 Summer in Fukuoka 登壇します


Slide 25

Slide 25 text

* Copyright (C) 2019 DeNA Co.,Ltd. All Rights Reserved. 
 
 
 
 「DeNA オートモーティブ」「DeNA AI」で検索
 
 ● https://dena-automotive.com/
 ● https://dena.ai/
 
 
 
 
 
 * We're Hiring !