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. ご清聴ありがとうございました