Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.jsのEOLと格闘した2年間の記録

dShikata
June 26, 2019
1.6k

 Node.jsのEOLと格闘した2年間の記録

EOLを迎えるNode.jsのバージョンアップで原因不明の接続障害が発生!原因がわからない。でも迫り来るEOL…。

・負荷テストによる原因追究
・ユーザに障害を気付かせないUI

など、この問題とどうやって向き合い、どのように乗り越えて行ったのか、私たちのEOLとの向き合い方の一例をご紹介します。

dShikata

June 26, 2019
Tweet

Transcript

  1. #RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsのEOLと格闘した

    2年間の記録 開発統括部 第二開発部 カスタマーサービス・クラウド開発課 四方 大輔 1
  2. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 自己紹介 • 四方 大輔 (シカタ

    ダイスケ) • 入社3年目 • メール共有・管理システム Mail Dealer の機能開発を担当 2
  3. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 本日の内容 • Mail Dealerとは •

    Node.jsがバージョンアップができない!? • Node.jsのEOLとの戦い • Node.jsをバージョンアップした!! 3
  4. #RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsのバージョンアップが

    できない!? 2年前 EOLとの戦い Node.js Verup(2回目) リリース
  5. #RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのバージョンアップができない!? 2年前にNode.jsをバージョンアップ (6系でマイナーverup) チャット切断障害が発生!! (きっかけとなった切断障害)

    • チャットの接続が定期的に切れる • ユーザから問い合わせは多数 • 原因が特定できずバージョンアップ前に切り戻すことに… 9
  6. #RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い

    2年前 EOLとの戦い Node.js Verup(2回目) リリース
  7. #RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い 切断時の問題点 • チャットが切断される •

    ユーザは手動で再接続しないといけない • UIのインパクトが大きい
  8. #RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い ▪問題点 チャットが切断される ⇒ すべて切断されるわけではない

    手動で再接続しないといけない ⇒ 自動で再接続されたら…? UIのインパクトが大きい ⇒ ユーザが気づかなければOK そうだ、チャット自動再接続機能を作ろう!!
  9. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 開発時の苦労 設計では… MDユーザ数を考慮した負荷分散 • チャット機能関連の閾値は決まっていなかった

    • 開発だけでなく、インフラチームの知見と協力が必要だった • 同時接続数など負荷試験を通して取得した 22 想定より大きな案件になった
  10. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 開発時の苦労 実装では… チャット全画面のUI改修 • UIが部品化されていなかった

    • 全画面改修 = 既存仕様を網羅している必要がある 開発環境と本番環境の違い • 開発環境はチャットサーバ1台、本番はチャットサーバ複数台 • LBサーバ変更が同時で動いてたこと (pound → nginx) 23
  11. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 自動再接続機能リリース 切断時の問題点 • チャットが切断される •

    ユーザは手動で再接続しないといけない • UIのインパクトが大きい 自動再接続機能ですべて解決
  12. #RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsのEOLとの戦い ▪問題点 チャットが切断される ⇒ 切断しても再接続される

    手動で再接続しないといけない ⇒ 自動で再接続される UIのインパクトが大きい ⇒ ユーザが気づかないUIに改修 自動再接続機能ですべて解決
  13. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 自動再接続機能リリース Node.js バージョンアップへ • Node.jsをバージョンアップすると

    切断が発生するものとして考える • 切断しても自動再接続機能が頑張ってくれる
  14. #RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsバージョンアップへ

    2年前 EOLとの戦い Node.js Verup(2回目) リリース
  15. #RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ Node.js v6系 ⇒ v10系

    へバージョンアップ • モジュールも合わせてバージョンアップする 負荷試験までは順調に進んだ • 影響調査やアプリケーションの対応など 34
  16. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 負荷試験 • 負荷試験だけで2ヵ月ぐらい使った • たまたま「接続切れ」が発生した

    ⇒ 原因を特定して解決することになった。 • socket.ioのみバージョンアップしない方針になった • 最新のv2系へのバージョンアップをやめて、v1系のまま • この状態の負荷試験で問題ないことが確認できた 35
  17. #RAKUSMeetup ©2019 RAKUS Co., Ltd. ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ

    リリース 2年前 EOLとの戦い Node.js Verup(2回目) リリース
  18. #RAKUSMeetup ©2019 RAKUS Co., Ltd. Node.jsバージョンアップ Node.jsのプロセスがメモリを大量消費していた • メモリを食い切って切断事象が発生している •

    チャット再接続によって大問題にはなっていない • アプリケーション側のバグではなさそう… 戦いは終わっていなかった… 42
  19. #RAKUSMeetup ©2019 RAKUS Co., Ltd. 今後の課題 • メモリの問題は調査継続中 チャット再接続が頑張ってくれている •

    Node.jsのメモリ周りで挙動が変わった? • Node.jsが使用しているメモリをうまく解放できていない?? • アプリケーション側で対応するしかない?? 43
  20. #RAKUSMeetup ©2019 RAKUS Co., Ltd. まとめ 原因不明のチャット切断問題を改善 • 根本的な解決が困難 •

    Node.jsがバージョンアップできない状態 • 正攻法以外の選択でEOLを乗り越えた • MW自体の原因追及ではなく、アプリケーションやUIを改修 • 根本的な解決にチャレンジしていきたい…!! 45