我在php上的项目中有nodejs应用程序。它的主要目的是向客户发送有关新事件的消息。
我用它来socket.io和redis pub / sub。我有一个redis频道。例如,当用户向站点上的其他用户发送电子邮件时,php代码会将此消息发布到redis频道。 Nodejs应用程序订阅此redis频道并向客户端发送新消息。在服务器上我有16个核心CPU,2.4GHz,16GB RAM和nodejs v0.10.18。平均使用率为9%。与nodejs的平均连接数为1500.在我的节点日志中,我经常会发现警告:
警告 - 客户端没有握手的客户端应该重新连接
此警告后客户端断开连接并且没有收到新消息。 可能是什么原因?
我制作测试nodejs app,你可以在github上看到它 https://github.com/devdemi/notifier-cluster 我试图打开4个浏览器窗口并记录2个不同的用户。 我发布到redis channel 7消息,每个socket接收这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
我读到这是为了避免警告“客户端没有握手的客户端应该重新连接”我需要使用集群。 在向redis频道发送7条消息后,我有下一个日志:
> 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核的intel core i5 cpu启动了它。当我使用2核时,它的工作正常。但是我使用4核心来获取消息:
警告 - 客户端没有握手的客户端应该重新连接
请解释群集如何正常工作?我需要什么来避免这种警告?
答案 0 :(得分:0)
现在我使用RedisStore
io.set('store', new RedisStore({
redis : redis
, redisPub : pub
, redisSub : sub
, redisClient : client
}));
socket.io将握手数据保存到Redis中。在此之后我收到了
警告 - 客户端没有握手的客户端应该重新连接
只有当我重新启动应用程序但我认为它应该在重新启动后。 它适用于集群。