【发布时间】:2014-01-18 15:32:03
【问题描述】:
我的 php 项目中有 nodejs 应用程序。它的主要目的是向客户端发送有关新事件的消息。
我使用 socket.io 和 redis pub/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
为了避免警告“客户端不握手客户端应该重新连接”我需要使用集群。 向 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 核英特尔酷睿 i5 cpu。当我使用 2 核时,它工作正常。但我使用 4 核我收到消息:
警告 - 客户端未握手,客户端应重新连接
请解释一下集群是如何工作的?我需要做什么来避免这个警告?
【问题讨论】:
标签: node.js websocket socket.io