Slide 1

Slide 1 text

Go + SQS + Fargate 速度 品質 低コスト を実現する 2021/8/25 土屋 陽介

Slide 2

Slide 2 text

2 ● バックエンドエンジニア ○ 開発・保守・インフラ等 ● いまレンタルスペースでやりたいこと ○ 屋上スペースでビアガーデン🍺 自己紹介 土屋 陽介 2019.8 Spacemarket入社

Slide 3

Slide 3 text

3 1. はじめに結論 2. Go 3. SQS 4. Fargate 5. まとめ アジェンダ

Slide 4

Slide 4 text

4 はじめに結論

Slide 5

Slide 5 text

5 Go + SQS + Fargateのシステム構成にしたことで得られた主な効果 【課題1】プランの変更がカレンダーに反映されるまでにタイムラグがある   => ほぼリアルタイムで変更内容をカレンダーに反映 【課題2】稀にプランの変更がカレンダーに反映されていないことがある   => 日次全件同期により反映漏れにも対応 【課題3】ハイスペックなインスタンスのためコストが高い => 柔軟なスケーリングによりコスト最適化を実現 はじめに結論

Slide 6

Slide 6 text

6 Go

Slide 7

Slide 7 text

7 Goの主な特徴 ● コンパイラ型言語で処理が高速 ● 並列処理が言語レベルでサポートされている ○ goroutine ○ channel ● シンプルな文法

Slide 8

Slide 8 text

8 Goを採用した背景

Slide 9

Slide 9 text

9 従来の予約導線 ① はじめにプランを選択 ② 予約可能な日時の中から利用したい日時を選択

Slide 10

Slide 10 text

10 従来のアーキテクチャ オンライン処理で空き状況を計算している  => CPU負荷が高く時間がかかる処理だった

Slide 11

Slide 11 text

11 空き状況の照会を1つのプランではなく全プラン行うという要件が出てきた 新たな予約導線 ① 利用日時を指定 ② 予約可能なプランのみを表示 (全プランの空き状況照会) ③ 予約したいプランを選択

Slide 12

Slide 12 text

12 従来のアーキテクチャ ひとつのスペースに数十個のプランが存在することも実際にある  => 数十倍の計算量になってしまいUXに致命的な影響を与えてしまう...!

Slide 13

Slide 13 text

13 従来のアーキテクチャ 画面表示に数十秒もかかるサービスを使いたいとは誰も思わない... => ユーザー離れに繋がってしまう

Slide 14

Slide 14 text

14 事前計算する仕組みに変更 空き状況の照会に必要な情報を事前計算(キャッシュ)するバッチを新設

Slide 15

Slide 15 text

15 差分更新 バッチを常駐起動し前回処理以降の更新レコードを検出  => カレンダー情報の差分のみを更新 例) 営業時間を変更 変更後の営業時間 前回実行以降に更 新されたレコードが バッチ処理対象 キャッシュ再構築 キャッシュ更新

Slide 16

Slide 16 text

16 差分更新 
 カレンダー同期ジョブ(AWS Batch)を無限ループ 差分を検知 => キャッシュ更新処理 を繰り返す仕組み AWS Batch Step Function

Slide 17

Slide 17 text

17 今回の要件にマッチ 求める要件 ● キャッシュ作成処理を高速に実行できること ● 習得難易度が高くないこと Goの特徴 ● コンパイラ型言語で処理が高速 ● 並列処理が言語レベルでサポートされている ● シンプルな文法 Goを採用した理由

Slide 18

Slide 18 text

18 Go + キャッシュ方式を採用した結果

Slide 19

Slide 19 text

19 処理速度の高速化 ● オンライン処理の応答性能 ○ 平均およそ 500 ms から数十 ms に向上 ○ 性能テストの結果、平常時トランザクションの約5倍まで劣化なし 学習コスト ● 各BEエンジニアがキャッチアップしながらの開発・保守が行えている Go + キャッシュ方式を採用した結果

Slide 20

Slide 20 text

20 SQS

Slide 21

Slide 21 text

21 SQSを採用した背景

Slide 22

Slide 22 text

22 事前計算方式の課題 ● 反映されるまでにタイムラグがある ○ 平均15分 ■ インスタンス起動時間 ■ ジョブ間の待機時間 ■ 処理対象がない場合でも5分程のインターバルが発生 ● 全件同期がしづらい ○ 現状の作りだと前の処理が終わらないと次の差分が反映されない ■ 全件同期を行うと処理対象が大量となるため、全件同期中に発生し た新たな変更については反映されるまでにかなり時間がかかってし まう SQSを使い始めた背景

Slide 23

Slide 23 text

23 カレンダーに影響がある要素の更新(*)エンドポイントと キャッシュ作成バッチとの間にSQS(キュー)を設置 * 貸出可能時間、特別営業期間 etc... 反映までのタイムラグを少なくする

Slide 24

Slide 24 text

24 反映までのタイムラグを少なくする
 カレンダーに影響がある要素が更新(*)された時にほぼリアルタイムで キャッシュが更新されるようになる * プラン料金の変更、貸出可能時間の変更 etc... 営業時間を更新した際に SQSに キューイング

Slide 25

Slide 25 text

25 カレンダーに影響がある要素が更新(*)された時にほぼリアルタイムで キャッシュが更新されるようになる * プラン料金の変更、貸出可能時間の変更 etc... 反映までのタイムラグを少なくする
 バッチを常駐起動(Fargate) SQSを常時監視しメッセージをトリガに処理実行

Slide 26

Slide 26 text

26 全件同期をしやすくする このままの状態で、全件同期するとキューが詰まって差分更新が遅れてしまう 差分更新は優先度が高い(変更された要素) 全件更新は優先度が低い(実際に更新される件数は僅か) SQSは先に入ったものから処理する (FIFOキュー) 高優先を先に処理して欲しいが前が詰まっ ている

Slide 27

Slide 27 text

27 全件同期をしやすくする 
 高優先と低優先のキューおよびFargateを設置   Priority Queue Pattern 低優先に大量にキューイングされている場合でも高優先の差分更新は即実行できる

Slide 28

Slide 28 text

28 SQSを採用した結果

Slide 29

Slide 29 text

29 SQSを採用した結果 【課題】反映されるまでにタイムラグがある   => 変更をほぼリアルタイムでカレンダーに反映 【課題】全件同期がしづらい => 高優先、低優先に分けたことで後続を気にせずに全件同期ができるように なった   => 万が一カレンダーの反映漏れがあっても日次で最新の状態に更新

Slide 30

Slide 30 text

30 Fargate

Slide 31

Slide 31 text

31 ● 管理が容易 ○ サーバーレス(EC2インスタンスの管理が不要) ○ EC2起動タイプと比較すると単価が高い ● コスト最適化 ○ Auto Scaling ○ Fargate Spot Fargateの特徴

Slide 32

Slide 32 text

32 Fargateを採用した背景

Slide 33

Slide 33 text

33 AWS Batch で構築したシステム(再掲) 
 大量に差分が発生する場合を見越して ハイスペックなインスタンスで並列処理を実行 AWS Batch 処理対象が少なくても大きなインスタンスで実行 => コスト最適化が課題

Slide 34

Slide 34 text

34 SQSから一度に取得できるメッセージは最大 10件  NG  ハイスペックなインスタンスで並列処理(スペックを活かしきれない)  Good 複数の小さなインスタンスで処理実行(適切なスペック・コストで処理) Fargate + SQS で構築したシステム(新)
 キューのメッセージ数に応じてバッチの処 理能力を増減させたい

Slide 35

Slide 35 text

35 Auto Scaling メッセージが少ない時 メッセージが多い時 1台 5台 Fargateはスケーリングが容易

Slide 36

Slide 36 text

36 Auto Scaling 設定 キューが100未満なら1台 キューが100以上なら2台 キューが1000-2100なら3台 ...etc

Slide 37

Slide 37 text

37 一定の制限付きで格安で使用できるFargate Spotを使用 Fargate Spotの特徴 ● AWSクラウドの空きリソースを70%OFFで利用できる ● AWS側のリソースが少なくなると許可なくサーバーが落とされる可能性がある スケールアウト時のコストを抑える

Slide 38

Slide 38 text

38 スケールアウト時のコストを抑える Fargate Spot採用にあたっての留意事項 ● べき等性が担保された処理 ○ サーバーが落ちて処理が中断しても問題ないこと ○ 再実行すればあるべきデータ状態にリカバリできる ● キャパシティープロバイダー戦略 ○ 仮に全部のFargate Spotが落ちた場合であってもキャッシュ更新処理が 完全に止まらないように一定割合はFargateを利用

Slide 39

Slide 39 text

39 キャパシティープロバイダー戦略 Fargate : Fargate Spot = 1 : 5 の割合で使用 最初の1台はFargate 2台目-6台目はFargateSpot 7台目はFargate 8-13台目はFargateSpot ...

Slide 40

Slide 40 text

40 Fargateを採用した結果

Slide 41

Slide 41 text

41 Fargateを採用した結果 【課題】ムダなコストがかかってしまっている ● 従来の30%もサーバーコストを抑えることができた。 ○ 必要な分だけインスタンスを起動(Auto Scaling) ○ Fargate Spotを利用 ● EC2インスタンスの管理が不要 ○ Auto Scaling を容易に実現 ○ 管理コストを削減

Slide 42

Slide 42 text

42 まとめ

Slide 43

Slide 43 text

43 ● Go + キャッシュ方式 ○ 高速なキャッシュ作成バッチを構築 ● SQS ○ カレンダー反映のタイムラグを解消 ○ 高優先、低優先を分けることで全件同期を日次で実行できるようになった ● Fargate ○ マネージドサービスのため管理が容易 ○ コストの最適化 ■ Auto Scaling ■ Fargate Spot ● サーバーコストを30%削減 まとめ

Slide 44

Slide 44 text

44 Go + SQS + Fargate 方式のバッチ処理の適用範囲を広げていきたい 従来のRails + AWS Batch方式のバッチ処理が未だに一部存在 これらには以下のような課題がある ● 反映に時間がかかる ● インフラコストの最適化の余地がある 今後の展望

Slide 45

Slide 45 text

 ご清聴ありがとうございました。