heroku session-affinityをdisableにし、socket.ioのpollingを切ってwebsocket onlyにした
$ heroku features:disable http-session-affinity
これによってpolling(comet)接続が使えなくなった
理由
なんかHerokuが調子悪そうだった為
元々のインフラ構成
などで説明している
一度session-affinityというcookieが設定されれば、24時間はそのクライアントのリクエストは同じ
dynoにルーティングされるようになる
はずなのだが
しょっちゅうsession-affinityがリセットされ、400 bad requestになってしまう
handshakeしてない知らない人からいきなりメッセージを送りつけられた扱いになる
pollingを完全に捨てて、
websocket onlyにすればsession-affinityは必要ない
しかし、ほとんど苦情が来なかった
来ても「新しいChromeをインストールしてくれ」で解決した
古いブラウザ使ってる人は居ないと判断した
思い切ってsocket.ioのpollingを切って、古いブラウザのサポートも切り、heroku session-affinityも無効にした
モダンブラウザ推奨メッセージが出る
実装
server.jsconst options = {
cookie: false,
serveClient: false,
transports: ['websocket']
}
const io = SocketIO(server, options)
client.jsconst options = {
reconnectionDelay: 5000,
transports: ['websocket']
}
const socket = SocketIO(location.origin, options)
結果
エラー無くなってすっきり
websocket onlyにしたら速くなった
編集が保存されるまでの時間
切断検知や再接続も
体感できるレベルで速い(計測してない)
コードがすっきりした
メモリ使用量も減った
50MBぐらい
webサーバー数も半分になった
ネットワーク経路によってはwebsocketを通さない事があるのではないか?という気がしているが、今のところ問題なさそう
scale直後でも、既存のclientが新しい
dynoにすぐルーティングされるようになった
sticky-sessionを有効にすると24時間同じdynoにルーティングするので、dynoを増やしてもすぐに効果が出なかった