Mais conteúdo relacionado
Semelhante a Router と WebSocket (20)
Mais de Kensaku Komatsu (20)
Router と WebSocket
- 2. • (@komasshu)
• WebSocket
• Google API Expert (HTML5)
• Microsoft Valuable Professional (IE)
- 12. point : Upgrade
Request Header (client => server)
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Response Header (server => client)
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Upgrade HTTP WebSocket
- 16. • nginx
• zip Access log HTTPS
• router
• URL routing
URL routing
unix domain
tcp socket
socket rails
(tcp socket )
80/443 sinatra
nginx router
node.js
DEA
- 17. WebSocket
nginx
• Request HTTP (502)
• tcp_proxy Patch
•
https://github.com/yaoweibin/nginx_tcp_proxy_module
- 18. nginx.conf
tcp {
upstream vcap_router {
server unix:/tmp/router.sock;
# server 127.0.0.1:2222;
# check interval=3000 rise=2 fall=5 timeout=1000;
}
tcp_nodelay off;
server {
listen 80;
server_name _;
proxy_read_timeout 200000;
proxy_send_timeout 200000;
proxy_pass vcap_router;
}
}
- 19. WebSocket
router
• HTTP Request/Response
HTTP
• WebSocket
Frames
• HTTP
- 20. dialog of router.rb
request
Header
router request/sec Router
on_headers
_complete()
unix module module node.js
nginx domain TCP socket
socket ClientConnection AppConnection
on_headers
_complete()
response
Header
response latency
- 21. WebSocket
Upgrade: websocket
proof of concept
WebsocketConnection
router
module TCP socket node.js
on_headers AppConnection
_complete() on_headers
unix module _complete()
nginx domain
socket ClientConnection
module
WebsocketConne TCP socket
node.js
ction WS
- 22. client_connection.rb
def on_headers_complete(headers)
....
# [kom] Check connection mode(websocket or not)
@is_websocket = (headers[UPGRADE_HEADER] == WEBSOCKET) ? true : false
Router.log.info "@is_websocket : #{@is_websocket}"
....
if (@is_websocket)
host, port = @droplet[:host], @droplet[:port]
@bound_app_conn = EM.connect(host, port, WebsocketConnection, self,
@headers, @droplet)
return
end
....
end
- 23. websocket_connection.rb
module WebsocketConnection
def initialize client, header, droplet
@client, @header, @droplet = client, header, droplet
end
def connection_completed
send_data(@header)
end
def receive_data(data)
@client.send_data(data)
end
def terminate
end
orz
end
- 25. • proof of concept
• production
• zip, ssl NG
• WebSocketConnection
• :)
Notas do Editor
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n