EMとWebSocketを使用し、サブスクライブされたクライアントにデータをブロードキャストするプロジェクトを構築しています。
次のように、なぜWebSocketをチャネルにサブスクライブすることを好むのでしょうか。
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen {
sid = @channel.subscribe { |msg| ws.send msg }
@channel.push "#{sid} connected!"
ws.onmessage { |msg|
@channel.push "<#{sid}>: #{msg}"
}
ws.onclose {
@channel.unsubscribe(sid)
}
}
end
各WebSocketを配列に追加する:
EM::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen {
puts "Websocket connection opened"
websocket_connections << ws
}
ws.onclose {
puts "Websocket connection closed"
websocket_connections.delete(ws)
}
end
配列全体を繰り返し処理し、ws.send msg
必要に応じて(またはその逆に)同様の呼び出しを行います。
チャネルの代替案は、EventMachineの非ブロッキング特性全体に対してより優れた最適化を備えていますか?(たとえば、サブスクライブされたソケットの一部に一度にブロードキャストし、すべてを一度に送信するのではなく、他のソケットを続行します)