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
Search
最新技術のエンジニア勉強会!シューマイ! ~Tech Lead Engineer~
September 23, 2020
0
200
シェアリングサービスのトランザクションを支えるGo
最新技術のエンジニア勉強会!シューマイ! ~Tech Lead Engineer~
September 23, 2020
Tweet
Share
More Decks by 最新技術のエンジニア勉強会!シューマイ! ~Tech Lead Engineer~
See All by 最新技術のエンジニア勉強会!シューマイ! ~Tech Lead Engineer~
Rails_and_spice
shuuumai
2
350
_何となく_世界からオファーが来る_エンジニアのなり方LT.pdf
shuuumai
1
440
循環的複雑度80超えの現行システムに Laravel × オニオンアーキテクチャ で立ち向かった話(栗原 史明 氏*株式会社うるる)
shuuumai
1
1.9k
シューマイ_Tech_Lead_Engineerから最新技術を学べ_Rails編_登壇資料.pdf
shuuumai
0
430
シューマツワーカー サービス資料
shuuumai
0
360
POL流レバレッジの効いたエンジニア組織を作る
shuuumai
1
390
REACT_NATIVE_EXPOで行うアプリの簡単最速運用_渡邊様_登壇資料_.pdf
shuuumai
0
270
Featured
See All Featured
Site-Speed That Sticks
csswizardry
2
190
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
KATA
mclloyd
29
14k
Why Our Code Smells
bkeepers
PRO
335
57k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Documentation Writing (for coders)
carmenintech
66
4.5k
RailsConf 2023
tenderlove
29
940
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
Designing for Performance
lara
604
68k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
Music & Morning Musume
bryan
46
6.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.6k
Transcript
シェアリング サービスの トランザクションを支える Go 2020/09/23 株式会社スペースマーケット 齋藤 哲
写真 2 自己紹介 経歴 NECソリューション イノベータ株式会社にて、 官公庁向けASPサービス事業にてソフトウェア 開発チーム リーダーとして事業拡大に貢献。 2019年に株式会社スペースマーケットへ入社。プ
ロダクト開発やエンジニア組織強化に従事。 2020 年よりCTOとして全社の技術戦略を担当。 趣味 カラオケ、ギター、機械学習 齋藤 哲・株式会社スペースマーケット
3 スペースマーケットのご紹介
4 スペースマーケットとは? 場所 (スペース) をシェアすることができるプラットフォーム 「働く」「遊ぶ」「暮らす」などのあらゆるシーンにおける選択肢を 広げると共に、遊休スペースの有効な活用・収益化に貢献 借りたい方や貸したい方の様々な “チャレンジ” をご支援しています
5 スペースマーケットのビジネスモデル
6 2020年8月にスペースマーケット WORK をローンチ 働くシーンに特化したスペースを貸し借りできるプラットフォーム 会議・テレワーク・セミナーなどスポット利用 (最短1時間15分単位) や 初期費用等不要でのオフィス レンタルでサテライトや
BCP 対策など
7 note で情報発信も積極的にやっています エンジニア マーケター ビジネス開発 デザイナー コーポレート
8 Go の採用に至るまでの経緯と内容
9 予約システムに係る課題
10 従前のアーキテクチャ フロントエンド、バックエンドからなる一般的なシステム構成 フロントは Node.js、API は Ruby on Rails
11 データ構造 1つのスペースに対し複数のプランが設定可能 さらにプランに対して複数の例外設定(特別営業)も可能 ※ 実際には他にもエンティティがありますが、主旨から外れるため省略しています
12 従前のアーキテクチャの問題点 様々にニーズをとらえるためにプランに工夫を重ねると 計算処理にかかる時間が増える(UX 低下)
13 そんな折に挙がった予約導線の改善施策 • 従前の UI ではプランを選択した上でカレンダーを表示 ◦ カレンダー表示の計算対象は1プランのみ ◦ この状態で
API 処理のみで平均およそ 500 ms • 施策の一環で、カレンダーで日時を決めた後にプランを選択 ◦ 全てのプランが計算対象に ◦ 10 以上のプランをもつスペースあり ◦ 従前のまま素直に実装すると数秒かかることに・・・
14 問題 • 予約直前までたどりついてくれたユーザーの体験が下がる • 予約まで進まずに途中で離脱 = コンバージョン低下 施策の目的が達成できないどころか場合によっては改悪に
15 課題 予約カレンダーの応答性能向上
16 目標 1. 予約カレンダーに必要な計算処理を、できるかぎりオンライン ではなく事前に計算してキャッシュする 2. キャッシュは、予約の状況にあわせてできるかぎり短時間で 更新されるようにする
17 予約カレンダーのキャッシュ
18 事前計算する仕組み作り スペースの営業時間や予約状況から カレンダーに表示する情報を事前計算する常駐バッチを追加
19 差分更新 前回実行時からの更新レコードを検出 カレンダー情報の差分のみを更新
20 キャッシュ更新時間の短縮
21 キャッシュの更新時間を短縮するには? [判断基準] • 計算処理のパフォーマンス • 並列処理の実装・保守の容易性 • 採用実績やエコシステムの充実 •
言語としてのシンプルさ(習得容易性) より効率的に計算ができる処理系を選択
22 処理系の比較結果 Go が最適と判断 判断基準 Go Java Node.js Rust C++
計算処理のパフォーマンス 3 2 1 5 4 並列処理の実装・保守の容易性 5 4 3 1 2 採用実績やエコシステムの充実 2 5 3 1 4 言語としてのシンプルさ 5 3 2 4 1 合計 15 14 9 11 11 ※ 社内での比較のため独自に調査した資料であり、処理系としての優劣を示す資料ではありません
23 [再掲] 事前計算する仕組み作り Go で新たにカレンダー構築ジョブを実装
24 並列処理の実装 Go に備わっている軽量スレッドにより とてもシンプルに並列処理を実装
25 苦労した点 • 性能最大化を図るため database/sql パッケージで SQL を直叩き • I
/ O スループットを高めることができたが・・・ • 並列処理も相まって接続プールの奪い合いからの実行時エラーが多発 • 以下のパラメータを調整してなんとか接続プールを循環できるように ◦ SetMaxOpenConns() ◦ SetMaxIdleConns() ◦ SetConnMaxLifetime() • ご参考:SQL ドライバ => go-sql-driver/mysql データベース接続プールの最適化
26 効果と課題
27 効果 • オンライン処理の応答性能 ◦ 平均およそ 500 ms から数十 ms
に向上 ◦ 性能テストの結果、平常時トランザクションの約5倍まで劣化 なし • キャッシュ更新の所要時間 ◦ 差分更新に当たり平均 15 分以内
28 課題 • カレンダー計算処理の重複解消 ◦ 予約確定時の在庫引当で再計算するため残存 ◦ 予約日時の範囲での計算になるため時間はかからないが保 守性が落ちるので解決したい •
キャッシュ更新のさらなる短縮 ◦ さらなるスケールや計算処理の一元化に向けて
29 さらなる改善後の姿
30 現在の仕組み 常駐バッチを廃し、元データ更新をトリガーにイベント発火 ジャスト イン タイムでカレンダーを更新
None