38
Web API をデバッグするときに必要な たったひとつのこと 2015/05/1 6 - Kanazawa.rb meetup 33

Web API をデバックするときに必要なたったひとつのこと

Embed Size (px)

Citation preview

Page 1: Web API をデバックするときに必要なたったひとつのこと

Web API をデバッグするときに必要なたったひとつのこと

2015/05/16 - Kanazawa.rb meetup 33

Page 2: Web API をデバックするときに必要なたったひとつのこと

かしこいロギング

こたえ

Page 3: Web API をデバックするときに必要なたったひとつのこと

かしこいロギング

こたえ

Page 4: Web API をデバックするときに必要なたったひとつのこと

Web API の特徴• 多数の構成要素

• ロードバランサ, リバースプロクシ, アプケーションサーバー, DB ...

• プロセス, スレッド …

• 多数の並列処理

• 複数クライアント, 多重 API コール …

Page 5: Web API をデバックするときに必要なたったひとつのこと

client A

client B

RP

RP

App Server

App Server

DB

DB

Process α

・ ・ ・

・ ・ ・

・ ・ ・

・ ・ ・

Process β

・ ・ ・

・ ・ ・

!

!

! !

!

!LB!

client A からの API コール x の 処理パスを特定して それぞれの log を 目 grep して…

Page 6: Web API をデバックするときに必要なたったひとつのこと

そんな装備で大丈夫か?

Page 7: Web API をデバックするときに必要なたったひとつのこと

–T.K, 2013

“開発環境はそんな複雑じゃない。複数 Terminal

開いて log を tail しておけば十分。”

Page 8: Web API をデバックするときに必要なたったひとつのこと

–T.K, 2014

“開発環境は複雑だった”

Page 9: Web API をデバックするときに必要なたったひとつのこと

–T.K, 2015

“本当のバグは運用環境にこそ潜む”

Page 10: Web API をデバックするときに必要なたったひとつのこと

かしこさの種• ロギング全般

• いろいろある。おおい。

• おググりください。

• Web API に絞ると

• 集約と識別

Page 11: Web API をデバックするときに必要なたったひとつのこと

集約と識別

Page 12: Web API をデバックするときに必要なたったひとつのこと

集約と識別

Page 13: Web API をデバックするときに必要なたったひとつのこと

ログの集約

• すでに様々なアプローチがある

• 古くは syslog

• イマドキは fluentd

Page 14: Web API をデバックするときに必要なたったひとつのこと

集約と識別

Page 15: Web API をデバックするときに必要なたったひとつのこと

ログの識別• API Call を識別する

• 構成要素横断で識別

• サーバやプロセスをまたいでも識別できることが大事

• API Call 毎に識別

• クライアント毎ではなく Call 毎であることが大事

Page 16: Web API をデバックするときに必要なたったひとつのこと

どうやって?

• 識別子を発行して構成要素間で伝搬

• だれが発行?

• どうやって伝搬?

Page 17: Web API をデバックするときに必要なたったひとつのこと

だれが発行?

Page 18: Web API をデバックするときに必要なたったひとつのこと

client A

client B

RP

RP

App Server

App Server

DB

DB

・ ・ ・

・ ・ ・

・ ・ ・

・ ・ ・

! !

LB!

APIクライアントに もっとも近い構成要素

入れやすいのはこの辺

!

Page 19: Web API をデバックするときに必要なたったひとつのこと

どうやって伝搬?

Page 20: Web API をデバックするときに必要なたったひとつのこと

・ ・ ・

・ ・ ・

・ ・ ・

client A

client B

RP

RP

App Server

App Server

DB

DB

・ ・ ・

・ ・ ・

・ ・ ・

・ ・ ・

! !

LB!

!

① API Call

② 識別子発行

③ 識別子付きで logging

④ 識別子付きでIPC(call)

⑤ 識別子付きで logging

⑥ 識別子付きでIPC(call)

⑦ 識別子付きで logging

⑧ 識別子付きでIPC(call)

⑨ 識別子付きで logging

⑩ 識別子付きでIPC(res)

⑫ 識別子付きでIPC(res)

⑪ 識別子付きで logging

⑬ 識別子付きで logging

⑭ 識別子付きでIPC(res)

⑮ 識別子付きで logging

⑯ API

Response

Page 21: Web API をデバックするときに必要なたったひとつのこと

シンプルな話

Page 22: Web API をデバックするときに必要なたったひとつのこと

押さえるべきポイントが もうひとつ

Page 23: Web API をデバックするときに必要なたったひとつのこと

どうやって?

• 識別子を発行して構成要素間で伝搬

• だれが発行?

• どうやって伝搬?

Page 24: Web API をデバックするときに必要なたったひとつのこと

どうやって?

• 識別子を発行して構成要素間で伝搬

• だれが発行?

• どうやって発行?

• どうやって伝搬?

New!

Page 25: Web API をデバックするときに必要なたったひとつのこと

client A

client B

RP

RP

App Server

App Server

DB

DB

・ ・ ・

! !

LB!

!

① API Call

② 識別子発行

LB!

①' API Call ②'

識別子発行

・ ・ ・

・ ・ ・

・ ・ ・

Page 26: Web API をデバックするときに必要なたったひとつのこと

client A

client B

RP

RP

App Server

App Server

DB

DB

・ ・ ・

! !

LB!

!

① API Call

② 識別子発行

LB!

①' API Call ②'

識別子発行

・ ・ ・

・ ・ ・

・ ・ ・

Page 27: Web API をデバックするときに必要なたったひとつのこと

ログの識別• API Call を識別する

• 構成要素横断で識別

• サーバやプロセスをまたいでも識別できることが大事

• API Call 毎に識別

• クライアント毎ではなく Call 毎であることが大事

Page 28: Web API をデバックするときに必要なたったひとつのこと

ログの識別• API Call を識別する

• 構成要素横断で識別

• サーバやプロセスをまたいでも識別できることが大事

• API Call 毎に識別

• クライアント毎ではなく Call 毎であることが大事

一意性 (Uniqueness)

Page 29: Web API をデバックするときに必要なたったひとつのこと

client A

client B

RP

RP

App Server

App Server

DB

DB

・ ・ ・

! !

LB!

!

① API Call

② 識別子発行

LB!

①' API Call ②'

識別子発行

・ ・ ・

・ ・ ・

・ ・ ・

Page 30: Web API をデバックするときに必要なたったひとつのこと

client A

client B

RP

RP

App Server

App Server

DB

DB

・ ・ ・

! !

LB!

!

① API Call

② 識別子発行

LB!

①' API Call ②'

識別子発行

・ ・ ・

・ ・ ・

・ ・ ・

識別子発行サーバー×The ボトルネック

Page 31: Web API をデバックするときに必要なたったひとつのこと

分散型ユニークID生成問題

Page 32: Web API をデバックするときに必要なたったひとつのこと

分散型採番手法

• 分散した採番環境それぞれで自立的に採番可能であること

• 採番結果が絶対に衝突しないこと

Page 33: Web API をデバックするときに必要なたったひとつのこと

分散型採番手法

• 分散した採番環境それぞれで自立的に採番可能であること

• 採番結果が絶対に衝突しないこと

Page 34: Web API をデバックするときに必要なたったひとつのこと

分散型採番手法

• 分散した採番環境それぞれで自立的に採番可能であること

• 採番結果の衝突確率が運用されるシステムにおいて十分に低確率であること

Page 35: Web API をデバックするときに必要なたったひとつのこと

分散型採番手法

• 大きな桁数のランダム文字列

• UUID

Page 36: Web API をデバックするときに必要なたったひとつのこと

分散型採番手法

• 演算コスト問題

• Snowflake

• Twitter の Tweet ID 生成手法

• 衝突確率は上がる

• Twitter にとっては十分低確率

Page 37: Web API をデバックするときに必要なたったひとつのこと

まとめ

• Web API におけるかしこいロギング

• 収集と識別を実現する

• 識別子には分散型ユニークID生成手法をもちいる

Page 38: Web API をデバックするときに必要なたったひとつのこと

Thank you

Tomokazu Kiyoharahttp://github.com/kiyohara

http://facebook.com/tomokazu.kiyohara