質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

1172閲覧

socket.ioセッションを長期的に維持する方法

mikomokaru

総合スコア0

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/03/09 04:45

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問