DMM.comの、一番深くておもしろいトコロ。

DMMアカウントサービスチームの取り組み(レイテンシ改善)

DMMアカウントサービスチームの取り組み(レイテンシ改善)

  • このエントリーをはてなブックマークに追加

はじめに

こんにちは! メンバーシップサービス部 アカウントサービスチームの今井です。
現在はアカウントサービスチームのプロダクトオーナーとして、チームが持つプロダクトの価値の最大化に務めています。
今回は、私たちのチームでの取り組みについて紹介したいと思います。

アカウントサービスチームとは

DMM会員の認証と顧客情報に関連するプロダクト(認証基盤と顧客情報基盤)を開発・運用・保守するチームです。
チームメンバーはプロダクトオーナー1名、スクラムマスター2名、開発メンバー8名(Aチーム4名、Bチーム4名ずつ)の計11名です。
「安心・安全・シームレスに利用できる会員サービスを提供する」ことをミッションに、2019年度下期は「多要素認証の導入」「OAuth 2.0 デバイスフローの導入」「セッション管理の改善」などの施策を通して、新規会員数の向上と不正被害・離脱率の削減に取り組んでいます。

これらの施策の結果等についてはまたの機会にお話しするとして、ここからはプロダクトの運用・保守のなかで実際に最近あった課題改善の実例を1つ紹介しようと思います。

最近の課題改善

2019年7月に入社したチームメンバーの小西さんによる調査から改善までのエピソードです。

小西さん
パフォーマンス改善した時とかに効果がパッとすぐに見られる仕組みがあったら良いなと思って、Kibanaでレスポンスタイム percentile ダッシュボード作ってみました!

今井
👍

小西さん
ピークタイムに 1%のユーザがログインに3秒かかってます。
f:id:dmminside:20191001142648p:plain

適当な時間枠でレスポンスタイムの分布を見てみると、3200〜3300ミリ秒(3.2~3.3秒)あたりに小さな山があることから、何らかの原因で、「固定で3秒かかるケースがある」ということがわかります。
f:id:dmminside:20191001142704p:plain

今井
🤦

小西さん
Datadog上でかかっている時間の内訳を見てみると、以下のとおり、ほとんどの時間が gateway.dmm.com との通信となっています。
f:id:dmminside:20191001142716p:plain

ログインページでのログからも、APIのリクエストを投げてからレスポンスを受け取るまでに3秒以上かかっているのがわかりました。
f:id:dmminside:20191001142726p:plain

合わせてgateway側のログを確認したところ、ログインページからのAPIのリクエストをgateway側で受け取ったのは3秒後でした。
つまりログインページ → gateway.dmm.com の通信経路のどこかで3秒間かかる場合がありますね。
通信経路側はインフラ部の管轄なので確認してもらいます!

今井
🙏

小西さん
調べてもらったら、以下の状況でした。

gateway.dmm.com側にTIME_WAITのセッションが多く残っています。
同じ送信元IP、送信元ポートで通信があった際にTIME_WAITのセッションが残っているとサーバ側がクライアント側にRSTパケットを返します。
クライアント側は1秒後に再送(1回目)します。
上位LBにて同じ送信元IP、送信元ポートからの通信は2秒間受け付けない設定があり 1回目の再送は破棄されます。
その2秒後に再送(2回目)されるので合計3秒遅れます。

・TIME_WAITをなくすには…
TCPにはアクティブクローズとパッシブクローズがあり、HTTPヘッダConnection: closeが 指定されるとサーバ側がアクティブクローズするため TIME_WAIT が残ります。
クライアント側がアクティブクローズすれば TIME_WAITはなくなります。

ログインページ側の問題として、以下のそれぞれの理由によってLB との通信に時間がかかっていしまっている。
- Connection: close ヘッダをつけて HTTP リクエストしている - TCP コネクションを使い回さず毎回再確立している

HTTP/1.1 では デフォルトで Connection: keep-alive の挙動になる はずですが、
Node.js の HTTP モジュールでは
Connection: close かつ TCP コネクションを再利用しないのがデフォルト(keepAlive: false)
になっており、これをそのまま利用していました。

Connection: keep-alive ヘッダをつけてリクエストするように修正します!

今井
💖

小西さん
99th percentileで、ピークタイム時に3秒かかっていたレスポンスタイムの山が無くなりました!
f:id:dmminside:20191001142741p:plain

今井
🙌

今井は何もしてないねというツッコミは置いておき、DatadogやKibana等のモニタリングや可視化ツールは調査時間を短縮するうえでも非常に重要ですね。
今回の事例が同じような課題に直面している方の参考になればと思います。
今後も石川のメンバーシップサービス部での事例や開発メンバーによる技術的な話の紹介ができればと思っていますので、乞うご期待!

さいごに

アカウントサービスチームは7月末に新しくなった石川事業所で勤務しております。
新石川事業所の雰囲気はこちらで感じてください。

私が所属しているメンバーシップサービス部では一緒に働く仲間を募集しています!
3,200万人(2019年現在)のユーザを支える会員プラットフォームの開発、運用に興味のある方はぜひ下記募集ページをご確認ください!
dmm-corp.com