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
190
シェアリングサービスのトランザクションを支える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
430
循環的複雑度80超えの現行システムに Laravel × オニオンアーキテクチャ で立ち向かった話(栗原 史明 氏*株式会社うるる)
shuuumai
1
1.9k
シューマイ_Tech_Lead_Engineerから最新技術を学べ_Rails編_登壇資料.pdf
shuuumai
0
430
シューマツワーカー サービス資料
shuuumai
0
340
POL流レバレッジの効いたエンジニア組織を作る
shuuumai
1
390
REACT_NATIVE_EXPOで行うアプリの簡単最速運用_渡邊様_登壇資料_.pdf
shuuumai
0
270
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
180
21k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Building Adaptive Systems
keathley
38
2.3k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Gamification - CAS2011
davidbonilla
80
5k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Visualization
eitanlees
145
15k
Designing for Performance
lara
604
68k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
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