当有人连接到节点服务器时,我保留一个包含所有套接字的数组.这样我就可以在需要时向所有人广播消息,或者循环通过用户来计算在线用户的数量等.
所有这一切都很好,但是当一个on disconnect事件被触发时,我的参数中没有收到套接字.还有另一种方法可以知道哪个套接字刚断开连接?
var allClients = [];
io.sockets.on('connection', function(socket) {
allClients.push(socket);
socket.on('disconnect', function(socket) {
console.log('Got disconnect!');
var i = allClients.indexOf(socket);
delete allClients[i];
});
});
Run Code Online (Sandbox Code Playgroud)
当然上面的例子不起作用,因为disconnect事件不会给出socket参数(或任何其他参数).那么还有另一个事件在断开连接之前触发了套接字仍在那里吗?
阿里
我们有一个运行RabbitMQ的测试,但不知何故达到一个"阈值",这使RabbitMQ变慢.
我们做了什么,我们设置了一个RabbitMQ服务器并制作了一个小的PHP脚本,它使用pecl-amqp连接(没有pconnect)到MQ服务器,发送1个随机消息并在此之后立即断开连接.我们将此过程分叉200次(单个php执行,因此没有线程),这意味着每秒+/- 2000个连接都会打开到MQ服务器并关闭.
之后,我在另一台服务器上启动相同的脚本来测量连接时间+读取时间.我们注意到客户端收到"Connection.Start"消息需要+/- 1.5秒.我为这个单个客户端添加了tcpdump的屏幕截图,向您展示了这种情况.我们看到的另一个问题是,有很多TCP无序和重传.
服务器规格
TCPdump http://i.imgur.com/rF1GsOy.png
sysctl设置:
fs.file-max = 11479756
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.conf.default.rp_filter = 0
net.ipv4.tcp_syncookies=1
net.core.somaxconn=2048
net.ipv4.ip_local_port_range = 10240 65535
net.nf_conntrack_max = 1000000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
Run Code Online (Sandbox Code Playgroud)
rabbitmq.conf
%% -*- mode: erlang -*-
[{
rabbit,
[{
tcp_listeners, [{
"10.0.1.69", 5672
}, {
"::1", 5672
}]
},
{tcp_listen_options, [binary,
{packet, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用nginx的地图,但结果并不是我所期望的.
这就是我所拥有的:
map $uri $new {
default "";
~*/cc/(?P<suffix>.*)$ test.php?suffix=$suffix;
}
location ~ [a-zA-Z0-9/_]+$ {
proxy_pass http://www.domain.com:81/$new;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Run Code Online (Sandbox Code Playgroud)
当我访问www.domain.com/cc/abc时,我会在日志中看到这一点
2012/03/29 17:27:53 [warn] 3382#0: *33 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/5/00/0000000005 while reading upstream, client: 1.2.3.4, server: www.domain.com, request: "GET /cc/abc HTTP/1.1", upstream: "http://1270.0.0.1:81/test.php?suffix=$suffix", host: "www.domain.com"
Run Code Online (Sandbox Code Playgroud)
$ suffix不会被替换.
但是当我这样做时:
map $uri $new {
default "";
~*/cc/(?P<suffix>.*)$ $suffix;
}
location ~ [a-zA-Z0-9/_]+$ {
proxy_pass http://www.domain.com:81/$new;
proxy_set_header …Run Code Online (Sandbox Code Playgroud)