generated at
heroku session-affinityをdisableにし、socket.ioのpollingを切ってwebsocket onlyにした

CosenseではHerokusession-affinity(sticky-session)機能を使っていたが、2018/5/17(木)の夕方に無効化した
$ heroku features:disable http-session-affinity
これによってpolling(comet)接続が使えなくなった


理由
なんかHerokuが調子悪そうだった為

元々のインフラ構成
などで説明している

一度session-affinityというcookieが設定されれば、24時間はそのクライアントのリクエストは同じdynoにルーティングされるようになる
はずなのだが
しょっちゅうsession-affinityがリセットされ、400 bad requestになってしまう
Socket.IOpolling(comet)は同じdynoにルーティングされないと切断されてしまう
handshakeしてない知らない人からいきなりメッセージを送りつけられた扱いになる


pollingを完全に捨てて、websocket onlyにすればsession-affinityは必要ない
5月頭にクメール語タイ語に対応する機能を入れたら、正規表現unicode flagが無いブラウザで表示が全くできなくなった
古いと言っても、Safari 9やGoogle bot等にも実装されていない
しかし、ほとんど苦情が来なかった
来ても「新しいChromeをインストールしてくれ」で解決した
古いブラウザ使ってる人は居ないと判断した

思い切ってsocket.ioのpollingを切って、古いブラウザのサポートも切り、heroku session-affinityも無効にした
モダンブラウザ推奨メッセージが出る

実装
server.js
const options = { cookie: false, serveClient: false, transports: ['websocket'] } const io = SocketIO(server, options)

client.js
const options = { reconnectionDelay: 5000, transports: ['websocket'] } const socket = SocketIO(location.origin, options)
HerokuでSocket.IOをやっていくで説明しているような、window close前に何か送信してから切断するみたいなテクニックも全部削除した


結果
エラー無くなってすっきり
websocket onlyにしたら速くなった
編集が保存されるまでの時間
切断検知や再接続も
体感できるレベルで速い(計測してない)
HerokuでSocket.IOをやっていくに書いているような変なテクニックは全部不要になった
コードがすっきりした
メモリ使用量も減った
50MBぐらい
webサーバー数も半分になった
ネットワーク経路によってはwebsocketを通さない事があるのではないか?という気がしているが、今のところ問題なさそう
scale直後でも、既存のclientが新しいdynoにすぐルーティングされるようになった
sticky-sessionを有効にすると24時間同じdynoにルーティングするので、dynoを増やしてもすぐに効果が出なかった