如何避免 socket.io 中出现警告"client not handshaken client should reconnect"?



我在php上的项目中有nodejs应用程序。它的主要目的是向客户端发送有关新事件的消息。

我用socket.io和redispub/sub。我有一个redis频道。例如,当用户向网站上的其他用户发送电子邮件时,php代码将此消息发布到redis频道。Nodejs应用程序订阅了这个redis通道并向客户端发送新消息。在服务器上,我有16核cpu、2.4GHz、16GB RAM和nodejs v0.10.18。平均cpu使用率为9%。到nodejs的平均连接数为1500。在我的节点日志中,我经常可以找到警告:

警告-客户端未握手客户端应重新连接

在此警告之后,客户端断开连接,没有收到新消息。原因是什么?

我制作了测试nodejs应用程序,你可以在github上看到它https://github.com/devdemi/notifier-cluster我尝试打开4个浏览器窗口,并与2个不同的用户登录。我发布到redis通道7消息,每个套接字接收这7条消息。所以我有4个套接字,然后nodejs得到21条消息。我认为这很糟糕,但我不知道如何更好地编写代码。请提供建议。

> Chanel[notifier-message]:21kxiNqfupovXAgnpH7o: get message 101==101
> Sent message [notifier-message]:21kxiNqfupovXAgnpH7o:
> {"toUserId":101,"message":1390053553752}
> Chanel[notifier-message]:R5hDp02fq3yeX4vupH7p: get message 104==101
> Chanel[notifier-message]:jQllRPNT1TIRn8YhpH7q: get message 101==101
> Sent message [notifier-message]:jQllRPNT1TIRn8YhpH7q:
> {"toUserId":101,"message":1390053553752}
> Chanel[notifier-message]:XTHshkPmN-uTzP6tpH7n: get message 104==101
> Chanel[notifier-message]:21kxiNqfupovXAgnpH7o: get message 101==102
> Chanel[notifier-message]:R5hDp02fq3yeX4vupH7p: get message 104==102
> Chanel[notifier-message]:jQllRPNT1TIRn8YhpH7q: get message 101==102
> Chanel[notifier-message]:XTHshkPmN-uTzP6tpH7n: get message 104==102
> Chanel[notifier-message]:21kxiNqfupovXAgnpH7o: get message 101==103
> Chanel[notifier-message]:R5hDp02fq3yeX4vupH7p: get message 104==103
> Chanel[notifier-message]:jQllRPNT1TIRn8YhpH7q: get message 101==103
> Chanel[notifier-message]:XTHshkPmN-uTzP6tpH7n: get message 104==103
> Chanel[notifier-message]:21kxiNqfupovXAgnpH7o: get message 101==104
> Chanel[notifier-message]:R5hDp02fq3yeX4vupH7p: get message 104==104
> Sent message [notifier-message]:R5hDp02fq3yeX4vupH7p:
> {"toUserId":104,"message":1390053553752}
> Chanel[notifier-message]:jQllRPNT1TIRn8YhpH7q: get message 101==104
> Chanel[notifier-message]:XTHshkPmN-uTzP6tpH7n: get message 104==104
> Sent message [notifier-message]:XTHshkPmN-uTzP6tpH7n:
> {"toUserId":104,"message":1390053553752}
> Chanel[notifier-message]:21kxiNqfupovXAgnpH7o: get message 101==105
> Chanel[notifier-message]:R5hDp02fq3yeX4vupH7p: get message 104==105
> Chanel[notifier-message]:jQllRPNT1TIRn8YhpH7q: get message 101==105
> Chanel[notifier-message]:XTHshkPmN-uTzP6tpH7n: get message 104==105
> Chanel[notifier-message]:21kxiNqfupovXAgnpH7o: get message 101==106
> Chanel[notifier-message]:R5hDp02fq3yeX4vupH7p: get message 104==106
> Chanel[notifier-message]:jQllRPNT1TIRn8YhpH7q: get message 101==106
> Chanel[notifier-message]:XTHshkPmN-uTzP6tpH7n: get message 104==106
> Chanel[notifier-message]:21kxiNqfupovXAgnpH7o: get message 101==107
> Chanel[notifier-message]:R5hDp02fq3yeX4vupH7p: get message 104==107
> Chanel[notifier-message]:jQllRPNT1TIRn8YhpH7q: get message 101==107
> Chanel[notifier-message]:XTHshkPmN-uTzP6tpH7n: get message 104==107

我读到这篇文章是为了避免警告"客户端未握手客户端应重新连接",我需要使用集群。我有下一个日志后发送7条消息到redis通道:

> Chanel[notifier-message]:LFthahgJCELKAco3sY64:6564:get message
> 101==101 Sent message [notifier-message]:LFthahgJCELKAco3sY64:
> {"toUserId":101,"message":1390054397147}
> Chanel[notifier-message]:xyZU162eAZQBz0YEsY65:6565:get message
> 101==101 Sent message [notifier-message]:xyZU162eAZQBz0YEsY65:
> {"toUserId":101,"message":1390054397147}
> Chanel[notifier-message]:OU5RrgvoyDyuu7lOsY63:6564:get message
> 102==101 Chanel[notifier-message]:G4J0aXzhRRLWxidOsY66:6564:get
> message 102==101
> Chanel[notifier-message]:LFthahgJCELKAco3sY64:6564:get message
> 101==102 Chanel[notifier-message]:OU5RrgvoyDyuu7lOsY63:6564:get
> message 102==102
> Chanel[notifier-message]:xyZU162eAZQBz0YEsY65:6565:get message
> 101==102 Sent message [notifier-message]:OU5RrgvoyDyuu7lOsY63:
> {"toUserId":102,"message":1390054397148}
> Chanel[notifier-message]:xyZU162eAZQBz0YEsY65:6565:get message
> 101==103 Chanel[notifier-message]:xyZU162eAZQBz0YEsY65:6565:get
> message 101==104
> Chanel[notifier-message]:G4J0aXzhRRLWxidOsY66:6564:get message
> 102==102 Chanel[notifier-message]:xyZU162eAZQBz0YEsY65:6565:get
> message 101==105 Sent message [notifier-message]:G4J0aXzhRRLWxidOsY66:
> {"toUserId":102,"message":1390054397148}
> Chanel[notifier-message]:xyZU162eAZQBz0YEsY65:6565:get message
> 101==106 Chanel[notifier-message]:xyZU162eAZQBz0YEsY65:6565:get
> message 101==107
> Chanel[notifier-message]:LFthahgJCELKAco3sY64:6564:get message
> 101==103 Chanel[notifier-message]:OU5RrgvoyDyuu7lOsY63:6564:get
> message 102==103
> Chanel[notifier-message]:G4J0aXzhRRLWxidOsY66:6564:get message
> 102==103 Chanel[notifier-message]:LFthahgJCELKAco3sY64:6564:get
> message 101==104
> Chanel[notifier-message]:OU5RrgvoyDyuu7lOsY63:6564:get message
> 102==104 Chanel[notifier-message]:G4J0aXzhRRLWxidOsY66:6564:get
> message 102==104
> Chanel[notifier-message]:LFthahgJCELKAco3sY64:6564:get message
> 101==105 Chanel[notifier-message]:OU5RrgvoyDyuu7lOsY63:6564:get
> message 102==105
> Chanel[notifier-message]:G4J0aXzhRRLWxidOsY66:6564:get message
> 102==105 Chanel[notifier-message]:LFthahgJCELKAco3sY64:6564:get
> message 101==106
> Chanel[notifier-message]:OU5RrgvoyDyuu7lOsY63:6564:get message
> 102==106 Chanel[notifier-message]:G4J0aXzhRRLWxidOsY66:6564:get
> message 102==106
> Chanel[notifier-message]:LFthahgJCELKAco3sY64:6564:get message
> 101==107 Chanel[notifier-message]:OU5RrgvoyDyuu7lOsY63:6564:get
> message 102==107
> Chanel[notifier-message]:G4J0aXzhRRLWxidOsY66:6564:get message
> 102==107

我在我的笔记本电脑上开始使用英特尔4核i5 cpu。当我使用2芯时,它工作得很好。但我使用4个核心我得到的信息:

警告-客户端未握手客户端应重新连接

请解释集群究竟是如何工作的?我需要什么来避免这些警告?

现在我使用RedisStore

io.set('store', new RedisStore({
redis    : redis
, redisPub : pub
, redisSub : sub
, redisClient : client
}));

socket.io将握手数据保存到Redis中。之后我收到

警告-客户端未握手客户端应重新连接

仅当我重新启动应用程序时,但我认为应该在重新启动之后。它在集群中运行良好。

最新更新