Go で Socket.IO のサーバに接続する

Node で実装した websocket のサーバにどのくらい接続できるのかを確かめるために CLI クライアントが欲しくなったので探してみた.使ってみたのは以下のもの.(たぶん)前のバージョンでコアに入ってたライブラリもあったけどちょっと簡単には扱えそうになかったので別のもので試す.

package main

import (
    "github.com/googollee/go-socket.io"
    "log"
)

func main() {
    client, err := socketio.Dial("http://localhost:3000")
    if err != nil {
        log.Fatalln(err)
        return
    }
    client.On("connect", func(ns *socketio.NameSpace) {
        log.Println("connected")
    })
    log.Println("start connect")
    client.Run()
}

これでつながった.さらに以下のようにすると 100 コネクションつなぐことが出来る.

package main

import (
    "github.com/googollee/go-socket.io"
    "log"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        client, err := socketio.Dial("http://localhost:3000")
        if err != nil {
            log.Println(err)
            return
        }
        client.On("connect", func(ns *socketio.NameSpace) {
            log.Println("connected")
        })
        log.Println("connect: ", i)
        go client.Run()
    }
    wg.Wait()
}

ただし websocket では各コネクションでファイルディスクリプタを使うためサーバおよびクライアントでそのプロセスが使えるファイルディスクリプタを確認,必要であれば大きな値を設定しておく必要がある.

$ ulimit -n
256                # 256 程度までしか接続できない
$ ulimit -n 2048   # 2048 程度まで接続できるようにする