Ich bin iodine's Autor, also könnte ich in meinem Ansatz voreingenommen sein.
halte ich würde einen Kanal durch die verwendeten ID Namensgebung (dh user1
... user201983
und sendet die Nachricht an den Kanal des Benutzers.
Ich denke, Faye dies unterstützen wird. Ich weiß, dass, wenn die Jod nativen WebSockets mit und builtin pub/sub, ist dies sehr effektiv.
Bisher habe ich gedacht, der Gründung eines neuen Socket-Objekt für jeden Kunden und sie in einer Hash-Speicherung ...
Dies ist ein sehr häufiger Fehler, der oft in einfachen Beispielen zu sehen ist.
Es funktioniert nur in einzelnen Prozessumgebungen und als Sie müssen die gesamte Logik umwandeln, um Ihre Anwendung zu skalieren.
Der Kanalansatz ermöglicht die Skalierung mit Redis oder einem anderen Pub/Sub-Dienst, ohne die Logik Ihrer Anwendung neu zu codieren.
Hier ist ein kleines Beispiel, das Sie aus dem Ruby-Terminal ausführen können (irb
). Ich verwende plezi.io nur um es kürzer Code ein bisschen zu machen:
require 'plezi'
class Example
def index
"Use Websockets to connect."
end
def pre_connect
if(!params[:id])
puts "an attempt to connect without credentials was made."
return false
end
return true
end
def on_open
subscribe channel: params[:id]
end
def on_message data
begin
msg = JSON.parse(data)
if(!msg["to"] || !msg["data"])
puts "JSON message error", data
return
end
msg["from"] = params[:id]
publish channel: msg["to"].to_s, message: msg.to_json
rescue => e
puts "JSON parsing failed!", e.message
end
end
end
Plezi.route "/" ,Example
Iodine.threads = 1
exit
dieses Beispiel zu testen, einen Javascript-Client verwenden, vielleicht so etwas wie folgt aus:
// in browser tab 1
var id = 1
ws = new WebSocket("ws://localhost:3000/" + id)
ws.onopen = function(e) {console.log("opened connection");}
ws.onclose = function(e) {console.log("closed connection");}
ws.onmessage = function(e) {console.log(e.data);}
ws.send_to = function(to, data) {
this.send(JSON.stringify({to: to, data: data}));
}.bind(ws);
// in browser tab 2
var id = 2
ws = new WebSocket("ws://localhost:3000/" + id)
ws.onopen = function(e) {console.log("opened connection");}
ws.onclose = function(e) {console.log("closed connection");}
ws.onmessage = function(e) {console.log(e.data);}
ws.send_to = function(to, data) {
this.send(JSON.stringify({to: to, data: data}));
}.bind(ws);
ws.send_to(1, "hello!")
Ich bin 'iodine' des Autor, also könnte ich voreingenommen sein, aber ich würde in Erwägung ziehen, einen Kanal nach der verwendeten ID (dh 'user1' ...' user201983') und Senden der Nachricht an den Kanal des Benutzers. Bei Verwendung der Jod native websockets und eingebauten Pub/sub , das ist ziemlich effektiv. – Myst