我们目前正在为一个客户开发一个网站(Apache下的TYPO3),该网站由node.js/socket.io应用程序提供支持,该应用程序为CMS提供的内容提供实时更新.
由于这是我们的第一个node.js项目,因此我在"完美设置"方面没有任何最佳实践,因此我花了一些时间研究部署技术.
我仍然有几个问题可以实现一个良好的设置:
易于部署客户.这一点非常重要,因为我们的网站将整合到他们的"实时"TYPO3安装中,该安装服务于大量网站,并且运行在不是由客户管理的服务器上,而是另一个(集中式)组织,它支持呼叫和服务器更改.进程缓慢.
应该很容易更新.如上所述,请求重新启动并进行服务器更改是一个缓慢的过程,因此理想情况下,节点安装应该在收到推送到实时安装的更改时重新启动/更新git.
部署
在普遍的共识似乎是使用forever,当涉及到部署节点的应用程序,防止他们逃跑.我已经测试了forever,并且在npm install forever -g(全局)安装时似乎工作正常.这需要外部协助来全局安装在实时环境中,所以我更喜欢从应用程序的node_modules目录运行它,但是我无法创建一个可靠的包装器来执行此操作.
此外,forever工作正常,但必须手动启动.什么是确保它在服务器启动时启动并保持运行的最佳方法?
init.d脚本?forever状态? 快速开发/重新启动更新
我们目前仍处于项目的开发阶段,每次我对node.js应用程序进行更改时,我都会手动重启node或forever.这有效,但远非理想.有几个较小的npm模块可以检查文件修改并node在检测到的更改时重新启动,例如:
有没有人有这些经验?
更新:你为什么不只使用群集?
该集群模块通过提供类似的功能重载机制,但不与节点0.5+工作.替换它的核心群集模块(节点0.6+)没有所有这些功能,只提供群集.而这反过来又不适合socket.io.至少没有使用Redis(这对我们来说是一个问题,因为我们不能强迫客户使用另一个先决条件服务).
-
显然,我正在尝试找到最稳定的解决方案,它将更新重启器与forever将项目交给客户之前结合起来,我真的希望有人能够生成经过验证的技术组合.
这是我的代码使用socket.io作为WebSocket和后端与pub/sub redis.
var io = io.listen(server),
buffer = [];
var redis = require("redis");
var subscribe = redis.createClient(); **<--- open new connection overhead**
io.on('connection', function(client) {
console.log(client.request.headers.cookie);
subscribe.get("..", function (err, replies) {
});
subscribe.on("message",function(channel,message) {
var msg = { message: [client.sessionId, message] };
buffer.push(msg);
if (buffer.length > 15) buffer.shift();
client.send(msg);
});
client.on('message', function(message){
});
client.on('disconnect', function(){
subscribe.quit();
});
});
Run Code Online (Sandbox Code Playgroud)
每个新的io请求都将创建新的redis连接.如果有人用100个标签打开浏览器,那么redis客户端将打开100个连接.它看起来不太好看.
如果cookie相同,是否可以重用redis连接?因此,如果有人打开许多浏览器标签,也将其视为开放1连接.