我现在有一个在线功能,要求我在我的数据库中设置一个字段,我已将其集成到获取通知更新中。因此,这是通过长轮询完成的(因为短轮询它不是更好,这导致与服务器的连接更少)。
我曾经在PHP上这样做,但正如那些了解PHP的人会理解的那样,即使在fpm下,PHP也会很快失去所有可用的连接。
所以我转向node.js,它应该能够处理数千甚至数百万的并发连接,但我看起来越多,似乎node.js通过基于事件的编程来处理这些。当然,基于事件的编程有很多好处。
这适用于聊天应用程序,但如果我有一个在线现在功能,我已经集成到长轮询中以标记用户仍然在线,那该怎么办?
node.js是否仍然会快速饱和,或者它是否真的能够处理这些打开的连接?
答案 0 :(得分:1)
长轮询将耗尽您的部分连接池,因此如果使用Linux或Unix,请确保将ulimit
设置为高。
理想情况下,您可以使用memcached或redis来维护状态。首选方法是使用Redis。为此,您将订阅发布/订阅频道,每次用户状态更新时,您都会发布一个活动。这将触发一个处理程序,该处理程序将导致您的长轮询以更新的状态响应。这通常更倾向于调度和更清洁,但只要您不循环或以其他方式阻止节点的执行线程,您就不应该看到任何问题。
由于您已经在使用PHP堆栈,因此可能不愿意放弃它。 PHP(更多是php-fpm)范例为每个连接启动一个进程,并将这些进程设置为超时。如此长时间的民意调查并非如此。
间隔短轮询可以更新前端的状态。正如您指定使用cronjob一样,只需将状态保存在前端的内存中并定期更新它就可能更清晰。
这应该可行,但这可能会增加您之前扩展的需求,因为每个用户都会发送 n 更多请求。但是,这可能是最简单的方法,并且您不会在堆栈中添加不必要的复杂性。
为这样一个简单的功能添加websockets可能有点过分,而websockets本身只能连接数量有限(取决于您的主机和配置),因此您并没有真正解决长轮询所带来的任何问题。如果您不打算使用websockets而不仅仅是维护用户状态,那么您需要在堆栈中添加另一项技术来解决一个简单的问题。