Node.jsのEOLと格闘した2年間の記録
by
dShikata
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsのEOLと格闘した 2年間の記録 開発統括部 第二開発部 カスタマーサービス・クラウド開発課 四方 大輔 1
Slide 2
Slide 2 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 自己紹介 • 四方 大輔 (シカタ ダイスケ) • 入社3年目 • メール共有・管理システム Mail Dealer の機能開発を担当 2
Slide 3
Slide 3 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 本日の内容 • Mail Dealerとは • Node.jsがバージョンアップができない!? • Node.jsのEOLとの戦い • Node.jsをバージョンアップした!! 3
Slide 4
Slide 4 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Mail Dealerについて
Slide 5
Slide 5 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Mail Dealer(MD) とは クラウド型のメール共有・管理システム 5
Slide 6
Slide 6 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. MDのチャット機能について 6
Slide 7
Slide 7 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. MDのチャット機能について 7
Slide 8
Slide 8 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsのバージョンアップが できない!? 2年前 EOLとの戦い Node.js Verup(2回目) リリース
Slide 9
Slide 9 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのバージョンアップができない!? 2年前にNode.jsをバージョンアップ (6系でマイナーverup) チャット切断障害が発生!! (きっかけとなった切断障害) • チャットの接続が定期的に切れる • ユーザから問い合わせは多数 • 原因が特定できずバージョンアップ前に切り戻すことに… 9
Slide 10
Slide 10 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. チャットの切断障害 接続時のUI
Slide 11
Slide 11 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. チャットの切断障害 切断時のUI
Slide 12
Slide 12 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. チャットの切断障害 切断時のUI ユーザが手動で再接続しないといけない 問い合わせが殺到
Slide 13
Slide 13 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのバージョンアップができない!? 調査が難航した 切断事象を再現できなかった • 一定の接続数や負荷をかけないと発生しない • 本番相当の負荷を検証環境にかけることが難しい • Node.jsの知見が浅い
Slide 14
Slide 14 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのバージョンアップができない!? バージョンアップができない状態に 再現できない 原因がわかっていない EOLは2年後(2019年4月) バージョンアップできないとセキュリティ的に問題
Slide 15
Slide 15 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い 2年前 EOLとの戦い Node.js Verup(2回目) リリース
Slide 16
Slide 16 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い 切断時のUI
Slide 17
Slide 17 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い 切断時の問題点 • チャットが切断される • ユーザは手動で再接続しないといけない • UIのインパクトが大きい
Slide 18
Slide 18 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い チャットの切断障害… Node.jsのバージョンアップは困難という状況 ユーザにとってはチャットが切断しなければOK 根本的な解決ができなくても ユーザにとって問題なければ良いのでは??
Slide 19
Slide 19 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い ■問題点 チャットが切断される ⇒ すべて切断されるわけではない 手動で再接続しないといけない ⇒ 自動で再接続されたら…? UIのインパクトが大きい ⇒ ユーザが気づかなければOK そうだ、チャット自動再接続機能を作ろう!!
Slide 20
Slide 20 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い チャット自動再接続 切断時のインパクトを抑える!! • チャットの切断を検知すると、自動で再接続する • 切断したことがわからないUIにする • 一定回数、自動再接続に失敗すると切断状態とする
Slide 21
Slide 21 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い 切断時のUI AFTER BEFORE
Slide 22
Slide 22 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 開発時の苦労 設計では… MDユーザ数を考慮した負荷分散 • チャット機能関連の閾値は決まっていなかった • 開発だけでなく、インフラチームの知見と協力が必要だった • 同時接続数など負荷試験を通して取得した 22 想定より大きな案件になった
Slide 23
Slide 23 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 開発時の苦労 実装では… チャット全画面のUI改修 • UIが部品化されていなかった • 全画面改修 = 既存仕様を網羅している必要がある 開発環境と本番環境の違い • 開発環境はチャットサーバ1台、本番はチャットサーバ複数台 • LBサーバ変更が同時で動いてたこと (pound → nginx) 23
Slide 24
Slide 24 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い 2018年9月 自動再接続機能リリース 24
Slide 25
Slide 25 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い 2018年9月 自動再接続機能リリース 25 このとき、チャット切断障害が発生!! (自動再接続リリースの切断)
Slide 26
Slide 26 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 自動再接続機能リリース 切断障害の原因 • リリースと同時にロードバランサを変更 設定に問題があり、切断事象が発生した 26
Slide 27
Slide 27 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 自動再接続機能リリース いきなり自動再接続が活躍!! 顧客からの問い合わせは少なかった 27
Slide 28
Slide 28 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 自動再接続機能リリース 自動再接続機能がリリースされたことで… Node.jsがバージョンアップできるようになりました。 28
Slide 29
Slide 29 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 自動再接続機能リリース 切断時の問題点 • チャットが切断される • ユーザは手動で再接続しないといけない • UIのインパクトが大きい 自動再接続機能ですべて解決
Slide 30
Slide 30 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い ■問題点 チャットが切断される ⇒ 切断しても再接続される 手動で再接続しないといけない ⇒ 自動で再接続される UIのインパクトが大きい ⇒ ユーザが気づかないUIに改修 自動再接続機能ですべて解決
Slide 31
Slide 31 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 自動再接続機能リリース Node.js バージョンアップへ • Node.jsをバージョンアップすると 切断が発生するものとして考える • 切断しても自動再接続機能が頑張ってくれる
Slide 32
Slide 32 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップへ まとめると… 最悪、切断事象が発生しても ユーザにとっては問題がない状態になった Node.jsがバージョンアップできるようになった
Slide 33
Slide 33 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsバージョンアップへ 2年前 EOLとの戦い Node.js Verup(2回目) リリース
Slide 34
Slide 34 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ Node.js v6系 ⇒ v10系 へバージョンアップ • モジュールも合わせてバージョンアップする 負荷試験までは順調に進んだ • 影響調査やアプリケーションの対応など 34
Slide 35
Slide 35 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 負荷試験 • 負荷試験だけで2ヵ月ぐらい使った • たまたま「接続切れ」が発生した ⇒ 原因を特定して解決することになった。 • socket.ioのみバージョンアップしない方針になった • 最新のv2系へのバージョンアップをやめて、v1系のまま • この状態の負荷試験で問題ないことが確認できた 35
Slide 36
Slide 36 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ リリース 2年前 EOLとの戦い Node.js Verup(2回目) リリース
Slide 37
Slide 37 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ Node.jsをバージョンアップを実施 チャット自動再接続があるので バージョンアップもこっそり実施 ついに2年間の戦いが終わる…!! 37
Slide 38
Slide 38 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ バージョンアップから2日後 ユーザからの問い合わせが… 「チャットの接続が不安定になっている」 このときまでは問題なく稼働していた 38
Slide 39
Slide 39 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ バージョンアップから2日後 ユーザからの問い合わせが… 「チャットの接続が不安定になっている」 このときまでは問題なく稼働していた 39 切断障害が発生!!
Slide 40
Slide 40 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ 切断障害 チャット自動再接続によってなんとか復旧!! ただし、想定以上の切断が発生していた 40
Slide 41
Slide 41 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ 今回の切断原因 Node.jsのプロセスでメモリが大量消費されていた • インフラチームによるチャットサーバの調査で判明 • また新たな問題が… 41
Slide 42
Slide 42 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ Node.jsのプロセスがメモリを大量消費していた • メモリを食い切って切断事象が発生している • チャット再接続によって大問題にはなっていない • アプリケーション側のバグではなさそう… 戦いは終わっていなかった… 42
Slide 43
Slide 43 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. 今後の課題 • メモリの問題は調査継続中 チャット再接続が頑張ってくれている • Node.jsのメモリ周りで挙動が変わった? • Node.jsが使用しているメモリをうまく解放できていない?? • アプリケーション側で対応するしかない?? 43
Slide 44
Slide 44 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. まとめ
Slide 45
Slide 45 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. まとめ 原因不明のチャット切断問題を改善 • 根本的な解決が困難 • Node.jsがバージョンアップできない状態 • 正攻法以外の選択でEOLを乗り越えた • MW自体の原因追及ではなく、アプリケーションやUIを改修 • 根本的な解決にチャレンジしていきたい…!! 45
Slide 46
Slide 46 text
#RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. ご清聴ありがとうございました