socket.ioセッションを長期的に維持する方法について
nextjsでキオスク端末用のWEBアプリを作成しています。
比較的リアルタイムな操作を行う必要があるのと、
ある端末での操作が、他端末にほぼリアルタイムに伝播する動きを期待して以下のような構成をとっています。
redis(バックエンド) - express(socket.ioサーバ) - react(socket.ioクライアント)
発生している問題・エラーメッセージ
キオスク端末なので、ページを表示したまま長期に渡って稼働させる必要があるのですが、
長期運用テストの結果が芳しくありません。具体的には、以下の症例が見られます。
- 数時間放置するとsocket.ioのセッションが切断されている
一時的に切断状態になるのは許容できるので、
接続を検知して再接続(autoheal)など、
socket.ioを扱うにあたり、できる限り接続を維持するパターンや、ノウハウ的なものをお教えいただけるとありがたいです。
該当のソースコード
クライアント側では以下のようにロード時に一度だけsocket.ioのセッションを生成しています。
javascript
1 const socket = useRef(); 2 //socket.ioの接続(一度だけ実行) 3 useEffect(()=>{ 4 setAudio(audioManager(new Audio(start),new Audio(preEnd),new Audio(end))) 5 socket.current = io( 6 addr, 7 { 8 reconnection: true, 9 reconnectionDelay: 1000, 10 reconnectionDelayMax: 5000, 11 reconnectionAttempts: 5, 12 transports: ["websocket"] 13 } 14 ) 15 //接続成功 16 socket.current.on('connect', ()=> { 17 }) 18 //切断 19 socket.current.on('disconnected', ()=> { 20 21 }); 22 //以下、各種イベントハンドラが続く 23 return ()=> { 24 console.log('disconnecting...') 25 socket.current.disconnect() 26 } 27 },[])
サーバ側は以下のような感じです。
javascript
1app = express() 2server = require('http').Server(app) 3io = require('socket.io')(server,{ 4 origins: '*:*' 5 cors:{ 6 origin: "*" 7 methods: ["GET", "POST"] 8 }, 9 pingTimeout: 60000, 10 pingInterval: 5000 11}) 12server.listen 3000
試したこと
一度、disconnectedイベントを拾って再接続するコードを書いたことがあるのですが、効果なく、
今現在は採用していません。
現在は非常に原始的ですが、一定間隔でページをリロードするような手段で逃げているところです。
ちなみに、ブラウザによるセッションの切れやすさは、 safari > chromium > firefox
のような気がしています(体感)
補足情報(FW/ツールのバージョンなど)
抜粋です。
クライアント環境
- ubuntu 20.04(arm64v8)
- chromium88.0.4324.182-1
- socket.io client 3.1.2
サーバ環境
- aws ecs + alb
- elasticache(redis6.0.5)
- node.js 14
- express 4.17.1
- socket.io 3.1.2
あなたの回答
tips
プレビュー