[Confidential] © 2013 Actcat, Inc. 1
モデルによるAPIの隠蔽の怖い話
レスポンスタイムへの致命的影響
[Confidential] © 2013 Actcat, Inc.
SideCIとは
n 継続的コードレビューサービス	
  
n コードを自動的に解析、問題を発見、	
  
改善を促します	
  
n Ruby,	
  PHPなどで開発されている	
  
プロジェクトで利用できます
2
[Confidential] © 2013 Actcat, Inc.
SideCIのご利用イメージ 1/2
3
GitHub	
  PullRequest	
  上の問題のあるコードに	
  
自動で問題点をコメントします	
  
[Confidential] © 2013 Actcat, Inc.
SideCIのご利用イメージ 2/2
4
コードに含まれる全ての問題点は	
  
SideCIの画面上で閲覧出来ます	
  
[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
[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
[Confidential] © 2013 Actcat, Inc. 7
ベータ版リリース当初アーキテクチャ
[Confidential] © 2013 Actcat, Inc.
マイクロサービスアーキテクチャ
8
www	
  
Frontend	
  +	
  
API	
  +	
  Job
Brakeman	
  
API	
  +	
  Job
Rails	
  Best	
  
Practices	
  
API	
  +	
  Job
Bundler	
  
API	
  +	
  Job
[Confidential] © 2013 Actcat, Inc.
ログイン後トップページの表示時APIコール
9
レポジトリの数だけ	
  
GitHubにAPIリクエスト
ブランチのリストAPI呼出
僕は誰?User	
  api呼出
ここらへんはDBに
保存・表示してた
[Confidential] © 2013 Actcat, Inc.
解析結果表示ページのAPIコール
10
このページはbrakeman専用サーバ
にAPIリクエスト、結果を表示
3サーバに同時にAPIリクエスト。	
  
結果が3つ揃うと表示する。	
  
(Brakeman,	
  bundler,	
  
rails_best_practicesの3サーバ)
[Confidential] © 2013 Actcat, Inc.
問題が	
  
発生したぽよ
11
[Confidential] © 2013 Actcat, Inc.
ログイン後トップページ
12
表示にかかる時間が15秒を	
  
超えてしまうユーザ多数	
  
	
  
Herokuのtimeoutが頻発	
  
[Confidential] © 2013 Actcat, Inc.
実は各ツールが頻繁にwwwを呼び出す仕様。
wwwがボトルネックに。一回金パワーした
13
www	
  
Frontend	
  +	
  
API	
  +	
  Job
Brakeman	
  
API	
  +	
  Job
Rails	
  Best	
  
Practices	
  
API	
  +	
  Job
Bundler	
  
API	
  +	
  Job
PX	
  
Dyno
[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
[Confidential] © 2013 Actcat, Inc.
(お金ないけど)
15
[Confidential] © 2013 Actcat, Inc.
GitHubのAPI呼び出し回数が
ボトルネックで、timeout頻発
16
www	
  
Frontend	
  +	
  
API	
  +	
  Job
Brakeman	
  
API	
  +	
  Job
Rails	
  Best	
  
Practices	
  
API	
  +	
  Job
Bundler	
  
API	
  +	
  Job
[Confidential] © 2013 Actcat, Inc.
金パワーの限界
17
[Confidential] © 2013 Actcat, Inc. 18
実装変更
[Confidential] © 2013 Actcat, Inc.
ログイン後トップページの表示時APIコール
19
ここはRedisキャッシュで	
  
なんとか
DBにデータ突っ込み	
  
[Confidential] © 2013 Actcat, Inc.
各サーバがRedisでキャッシュ
20
www	
  
Frontend	
  +	
  
API	
  +	
  Job
Brakeman	
  
API	
  +	
  Job
Rails	
  Best	
  
Practices	
  
API	
  +	
  Job
Bundler	
  
API	
  +	
  Job
Redis	
  CacheRedis	
  Cache
SideCI	
  API	
  Result	
  
Redis	
  Cache
一部	
  
Redis	
  Cache
[Confidential] © 2013 Actcat, Inc.
なんとか動くように	
  
なったけど…	
  
21
[Confidential] © 2013 Actcat, Inc.
つぎはぎの対応ばかり。	
  
全体的に無駄・無理が多い	
  
22
[Confidential] © 2013 Actcat, Inc.
結論:	
  
マイクロサービス	
  
アーキテクチャは辞めて	
  
新しいアーキテクチャで再実装
23
[Confidential] © 2013 Actcat, Inc. 24
原因分析
[Confidential] © 2013 Actcat, Inc.
なぜこんなことが	
  
起こったか?
25
[Confidential] © 2013 Actcat, Inc. 26
www	
  
Frontend	
  +	
  
API	
  +	
  Job
Brakeman	
  
API	
  +	
  Job
Rails	
  Best	
  
Practices	
  
API	
  +	
  Job
Bundler	
  
API	
  +	
  Job
APIのリクエストが多すぎた	
  
[Confidential] © 2013 Actcat, Inc.
なぜこんなに	
  
APIリクエストが	
  
多かったのか?
27
[Confidential] © 2013 Actcat, Inc. 28
www	
  
Frontend	
  +	
  
API	
  +	
  Job
Brakeman	
  
API	
  +	
  Job
Rails	
  Best	
  
Practices	
  
API	
  +	
  Job
Bundler	
  
API	
  +	
  Job
各サーバにとって必要な情報が、	
  
他のサーバの管轄だった。	
  
各サーバは管轄サーバに	
  
APIで問い合わせるしかなかった
[Confidential] © 2013 Actcat, Inc.
なんでこんな面倒な	
  
設計で実装が出来たのか?
29
[Confidential] © 2013 Actcat, Inc.
なんでこんな面倒な	
  
設計で実装が出来たのか?
30
[Confidential] © 2013 Actcat, Inc.
ActiveResource 超便利!
31
[Confidential] © 2013 Actcat, Inc.
さもDBに入っている	
  
データであるかのように、	
  
APIのデータを使ってた。
32
[Confidential] © 2013 Actcat, Inc.
惜しげも無く	
  
APIリクエスト
33
[Confidential] © 2013 Actcat, Inc.
APIリクエストである認識が
そもそもなかった
34
[Confidential] © 2013 Actcat, Inc. 35
ここまでのまとめ
[Confidential] © 2013 Actcat, Inc.
ActiveResouceはAPIだ!
n APIは隠蔽してもAPIだ(当たり前だ!	
  
n Cache	
  Resourceで多少問題回避出来たが、
Cacheの管理のほうが大変になる。
n 隠蔽していても、APIだという認識で設計、
実装が不可欠
36
[Confidential] © 2013 Actcat, Inc. 37
ちなみに現在
[Confidential] © 2013 Actcat, Inc.
各ツール毎のサーバを廃止。APIの集約廃止。
必要なデータはJob Enqueue時に付与
38
www	
  
Frontend	
  +	
  
(API)	
  +	
  Job
Job管理	
  
サーバ
Job実施	
  
サーバ
必要なデータが入っ
たリクエストで
Enqueue
[Confidential] © 2013 Actcat, Inc. 39
SIDECIの宣伝
[Confidential] © 2013 Actcat, Inc.
開発メンバー募集中です
n アーキテクチャ綺麗になりました	
  
n スケーラブルなアーキテクチャです	
  
n 開発メンバー募集中です!
40
[Confidential] © 2013 Actcat, Inc. 41
もしまだ使ったことない方ぜひ。	
  
設定は30秒で終わります。	
  
Just	
  nowでSign	
  Upして貰えると嬉しいです	
  
https://www.sideci.com/	
  

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

  • 1.
    [Confidential] © 2013Actcat, Inc. 1 モデルによるAPIの隠蔽の怖い話 レスポンスタイムへの致命的影響
  • 2.
    [Confidential] © 2013Actcat, Inc. SideCIとは n 継続的コードレビューサービス   n コードを自動的に解析、問題を発見、   改善を促します   n Ruby,  PHPなどで開発されている   プロジェクトで利用できます 2
  • 3.
    [Confidential] © 2013Actcat, Inc. SideCIのご利用イメージ 1/2 3 GitHub  PullRequest  上の問題のあるコードに   自動で問題点をコメントします  
  • 4.
    [Confidential] © 2013Actcat, Inc. SideCIのご利用イメージ 2/2 4 コードに含まれる全ての問題点は   SideCIの画面上で閲覧出来ます  
  • 5.
    [Confidential] © 2013Actcat, 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
  • 6.
    [Confidential] © 2013Actcat, 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
  • 7.
    [Confidential] © 2013Actcat, Inc. 7 ベータ版リリース当初アーキテクチャ
  • 8.
    [Confidential] © 2013Actcat, Inc. マイクロサービスアーキテクチャ 8 www   Frontend  +   API  +  Job Brakeman   API  +  Job Rails  Best   Practices   API  +  Job Bundler   API  +  Job
  • 9.
    [Confidential] © 2013Actcat, Inc. ログイン後トップページの表示時APIコール 9 レポジトリの数だけ   GitHubにAPIリクエスト ブランチのリストAPI呼出 僕は誰?User  api呼出 ここらへんはDBに 保存・表示してた
  • 10.
    [Confidential] © 2013Actcat, Inc. 解析結果表示ページのAPIコール 10 このページはbrakeman専用サーバ にAPIリクエスト、結果を表示 3サーバに同時にAPIリクエスト。   結果が3つ揃うと表示する。   (Brakeman,  bundler,   rails_best_practicesの3サーバ)
  • 11.
    [Confidential] © 2013Actcat, Inc. 問題が   発生したぽよ 11
  • 12.
    [Confidential] © 2013Actcat, Inc. ログイン後トップページ 12 表示にかかる時間が15秒を   超えてしまうユーザ多数     Herokuのtimeoutが頻発  
  • 13.
    [Confidential] © 2013Actcat, Inc. 実は各ツールが頻繁にwwwを呼び出す仕様。 wwwがボトルネックに。一回金パワーした 13 www   Frontend  +   API  +  Job Brakeman   API  +  Job Rails  Best   Practices   API  +  Job Bundler   API  +  Job PX   Dyno
  • 14.
    [Confidential] © 2013Actcat, Inc. 解析結果ページ表示も timeoutしたのでこっちも金パワーした 14 www   Frontend  +   API  +  Job Brakeman   API  +  Job Rails  Best   Practices   API  +  Job Bundler   API  +  Job 2x   Dyno 2x   Dyno 2x   Dyno
  • 15.
    [Confidential] © 2013Actcat, Inc. (お金ないけど) 15
  • 16.
    [Confidential] © 2013Actcat, Inc. GitHubのAPI呼び出し回数が ボトルネックで、timeout頻発 16 www   Frontend  +   API  +  Job Brakeman   API  +  Job Rails  Best   Practices   API  +  Job Bundler   API  +  Job
  • 17.
    [Confidential] © 2013Actcat, Inc. 金パワーの限界 17
  • 18.
    [Confidential] © 2013Actcat, Inc. 18 実装変更
  • 19.
    [Confidential] © 2013Actcat, Inc. ログイン後トップページの表示時APIコール 19 ここはRedisキャッシュで   なんとか DBにデータ突っ込み  
  • 20.
    [Confidential] © 2013Actcat, Inc. 各サーバがRedisでキャッシュ 20 www   Frontend  +   API  +  Job Brakeman   API  +  Job Rails  Best   Practices   API  +  Job Bundler   API  +  Job Redis  CacheRedis  Cache SideCI  API  Result   Redis  Cache 一部   Redis  Cache
  • 21.
    [Confidential] © 2013Actcat, Inc. なんとか動くように   なったけど…   21
  • 22.
    [Confidential] © 2013Actcat, Inc. つぎはぎの対応ばかり。   全体的に無駄・無理が多い   22
  • 23.
    [Confidential] © 2013Actcat, Inc. 結論:   マイクロサービス   アーキテクチャは辞めて   新しいアーキテクチャで再実装 23
  • 24.
    [Confidential] © 2013Actcat, Inc. 24 原因分析
  • 25.
    [Confidential] © 2013Actcat, Inc. なぜこんなことが   起こったか? 25
  • 26.
    [Confidential] © 2013Actcat, Inc. 26 www   Frontend  +   API  +  Job Brakeman   API  +  Job Rails  Best   Practices   API  +  Job Bundler   API  +  Job APIのリクエストが多すぎた  
  • 27.
    [Confidential] © 2013Actcat, Inc. なぜこんなに   APIリクエストが   多かったのか? 27
  • 28.
    [Confidential] © 2013Actcat, Inc. 28 www   Frontend  +   API  +  Job Brakeman   API  +  Job Rails  Best   Practices   API  +  Job Bundler   API  +  Job 各サーバにとって必要な情報が、   他のサーバの管轄だった。   各サーバは管轄サーバに   APIで問い合わせるしかなかった
  • 29.
    [Confidential] © 2013Actcat, Inc. なんでこんな面倒な   設計で実装が出来たのか? 29
  • 30.
    [Confidential] © 2013Actcat, Inc. なんでこんな面倒な   設計で実装が出来たのか? 30
  • 31.
    [Confidential] © 2013Actcat, Inc. ActiveResource 超便利! 31
  • 32.
    [Confidential] © 2013Actcat, Inc. さもDBに入っている   データであるかのように、   APIのデータを使ってた。 32
  • 33.
    [Confidential] © 2013Actcat, Inc. 惜しげも無く   APIリクエスト 33
  • 34.
    [Confidential] © 2013Actcat, Inc. APIリクエストである認識が そもそもなかった 34
  • 35.
    [Confidential] © 2013Actcat, Inc. 35 ここまでのまとめ
  • 36.
    [Confidential] © 2013Actcat, Inc. ActiveResouceはAPIだ! n APIは隠蔽してもAPIだ(当たり前だ!   n Cache  Resourceで多少問題回避出来たが、 Cacheの管理のほうが大変になる。 n 隠蔽していても、APIだという認識で設計、 実装が不可欠 36
  • 37.
    [Confidential] © 2013Actcat, Inc. 37 ちなみに現在
  • 38.
    [Confidential] © 2013Actcat, Inc. 各ツール毎のサーバを廃止。APIの集約廃止。 必要なデータはJob Enqueue時に付与 38 www   Frontend  +   (API)  +  Job Job管理   サーバ Job実施   サーバ 必要なデータが入っ たリクエストで Enqueue
  • 39.
    [Confidential] © 2013Actcat, Inc. 39 SIDECIの宣伝
  • 40.
    [Confidential] © 2013Actcat, Inc. 開発メンバー募集中です n アーキテクチャ綺麗になりました   n スケーラブルなアーキテクチャです   n 開発メンバー募集中です! 40
  • 41.
    [Confidential] © 2013Actcat, Inc. 41 もしまだ使ったことない方ぜひ。   設定は30秒で終わります。   Just  nowでSign  Upして貰えると嬉しいです   https://www.sideci.com/