ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~...

41
[Confidential] © 2013 Actcat, Inc. 1 モデルによるAPIの隠蔽の怖い話 ~レスポンスタイムへの致命的影響~

Transcript of ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~...

Page 1: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 1

モデルによるAPIの隠蔽の怖い話 ~レスポンスタイムへの致命的影響~

Page 2: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

SideCIとは

n 継続的コードレビューサービス  

n コードを自動的に解析、問題を発見、  改善を促します  

n Ruby,  PHPなどで開発されている  プロジェクトで利用できます

2

Page 3: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

SideCIのご利用イメージ 1/2

3

GitHub  PullRequest  上の問題のあるコードに  自動で問題点をコメントします  

Page 4: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

SideCIのご利用イメージ 2/2

4

コードに含まれる全ての問題点は  SideCIの画面上で閲覧出来ます  

Page 5: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

SideCIのアーキテクチャ(2015/06) 8種類以上のサーバが…

n Frontend(API+Frontend+Job)  n ツール毎サーバ  

l RaislBestPractices(API+Job)  l Brakeman(API+Job)  l Bundler(API+Job)  

n +  新しいアーキテクチャのサーバ  l Job  処理サーバ(using  docker)  l Job  管理サーバ  

5

Page 6: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

SideCIのアーキテクチャの歴史(の一部) サーバ構成を4回以上変えた

n  2014/04/30  l ベータ版リリース  l Heroku  でサービス提供  l 解析処理は解析ツール毎のサーバで  

n  2014/夏  l AWSにjob処理部分を移行  

n  2015/03  l アーキテクチャ全面見直し  l 解析処理をどの解析ツールでも同じサーバ内でdockerを用いて実施するタイプを追加  

n  2015/07  l 解析ツール毎のサーバを全台廃止  

6

Page 7: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 7

ベータ版リリース当初アーキテクチャ

Page 8: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

マイクロサービスアーキテクチャ

8

www  Frontend  +  API  +  Job

Brakeman  API  +  Job

Rails  Best  Practices  API  +  Job

Bundler  API  +  Job

Page 9: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

ログイン後トップページの表示時APIコール

9

レポジトリの数だけ  GitHubにAPIリクエスト

ブランチのリストAPI呼出

僕は誰?User  api呼出 ここらへんはDBに保存・表示してた

Page 10: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

解析結果表示ページのAPIコール

10

このページはbrakeman専用サーバにAPIリクエスト、結果を表示

3サーバに同時にAPIリクエスト。  結果が3つ揃うと表示する。  

(Brakeman,  bundler,  rails_best_practicesの3サーバ)

Page 11: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

問題が  発生したぽよ

11

Page 12: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

ログイン後トップページ

12

表示にかかる時間が15秒を  超えてしまうユーザ多数  

 Herokuのtimeoutが頻発  

Page 13: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

実は各ツールが頻繁にwwwを呼び出す仕様。 wwwがボトルネックに。一回金パワーした

13

www  Frontend  +  API  +  Job

Brakeman  API  +  Job

Rails  Best  Practices  API  +  Job

Bundler  API  +  Job

PX  Dyno

Page 14: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

解析結果ページ表示も timeoutしたのでこっちも金パワーした

14

www  Frontend  +  API  +  Job

Brakeman  API  +  Job

Rails  Best  Practices  API  +  Job

Bundler  API  +  Job

2x  Dyno

2x  Dyno

2x  Dyno

Page 15: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

(お金ないけど)

15

Page 16: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

GitHubのAPI呼び出し回数が ボトルネックで、timeout頻発

16

www  Frontend  +  API  +  Job

Brakeman  API  +  Job

Rails  Best  Practices  API  +  Job

Bundler  API  +  Job

Page 17: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

金パワーの限界

17

Page 18: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 18

実装変更

Page 19: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

ログイン後トップページの表示時APIコール

19

ここはRedisキャッシュで  なんとか

DBにデータ突っ込み  

Page 20: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

各サーバがRedisでキャッシュ

20

www  Frontend  +  API  +  Job

Brakeman  API  +  Job

Rails  Best  Practices  API  +  Job

Bundler  API  +  Job

Redis  Cache Redis  Cache SideCI  API  Result  Redis  Cache

一部  Redis  Cache

Page 21: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

なんとか動くように  なったけど…  

21

Page 22: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

つぎはぎの対応ばかり。  全体的に無駄・無理が多い  

22

Page 23: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

結論:  マイクロサービス  

アーキテクチャは辞めて  新しいアーキテクチャで再実装

23

Page 24: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 24

原因分析

Page 25: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

なぜこんなことが  起こったか?

25

Page 26: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 26

www  Frontend  +  API  +  Job

Brakeman  API  +  Job

Rails  Best  Practices  API  +  Job

Bundler  API  +  Job

APIのリクエストが多すぎた  

Page 27: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

なぜこんなに  APIリクエストが  多かったのか?

27

Page 28: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 28

www  Frontend  +  API  +  Job

Brakeman  API  +  Job

Rails  Best  Practices  API  +  Job

Bundler  API  +  Job

各サーバにとって必要な情報が、  他のサーバの管轄だった。  各サーバは管轄サーバに  

APIで問い合わせるしかなかった

Page 29: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

なんでこんな面倒な  設計で実装が出来たのか?

29

Page 30: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

なんでこんな面倒な  設計で実装が出来たのか?

30

Page 31: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

ActiveResource 超便利!

31

Page 32: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

さもDBに入っている  データであるかのように、  APIのデータを使ってた。

32

Page 33: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

惜しげも無く  APIリクエスト

33

Page 34: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

APIリクエストである認識がそもそもなかった

34

Page 35: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 35

ここまでのまとめ

Page 36: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

ActiveResouceはAPIだ!

n APIは隠蔽してもAPIだ(当たり前だ!  

n Cache  Resourceで多少問題回避出来たが、Cacheの管理のほうが大変になる。

n 隠蔽していても、APIだという認識で設計、実装が不可欠

36

Page 37: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 37

ちなみに現在

Page 38: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

各ツール毎のサーバを廃止。APIの集約廃止。 必要なデータはJob Enqueue時に付与

38

www  Frontend  +  (API)  +  Job

Job管理  サーバ

Job実施  サーバ

必要なデータが入ったリクエストで

Enqueue

Page 39: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 39

SIDECIの宣伝

Page 40: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc.

開発メンバー募集中です

n アーキテクチャ綺麗になりました  

n スケーラブルなアーキテクチャです  

n 開発メンバー募集中です!

40

Page 41: ActiveResourceモデルによるAPIの隠蔽の怖い話~レスポンスタイムへの致命的影響~ at #shinjukurb

[Confidential] © 2013 Actcat, Inc. 41

もしまだ使ったことない方ぜひ。  設定は30秒で終わります。  

Just  nowでSign  Upして貰えると嬉しいです  https://www.sideci.com/