nodejs如何无伤更新?
发布于 10 年前 作者 networkwx 25023 次浏览 最后一次编辑是 8 年前

nodejs有个问题一直困扰着我,nodejs如何做到无伤更新?也就是说如果有一个版本需要更新,那么是需要重启的,对于web来说还好,但是对于游戏来说就麻烦了,要维护着长连接,如果重启,肯定是不行的,求个解决方案?

11 回复
  1. 做个代理, 并对请求设置对应的权重,如:proxy = s1(60%) + s2(40%);
  2. 有更新时,降低 s2 的权重(降低为0则关闭连接请求)。新的请求会到 s1 上
  3. s2 上已有的连接你不想丢失,只能等待所有连接正常断开
  4. 当 s2 上无活动连接时,可以进行更新
  5. 更新完成后,恢复对应的权重

小修正依赖短时的断线重连(游戏不可能不做断线重连吧). 大更新追求一致性, 不可能不停机维护.

大版本肯定是停机维护的,但是偶尔要修个什么BUG啊,或者上个什么小功能之类的,也要重启,感觉很不靠谱啊,一瞬间全断了,然后一瞬间全重连!并发瞬间高起来了。。

这样当然是可以,有没有什么软件可以在前面承载连接,然后把具体的逻辑处理交由另一个服务来完成,如果有这样的软件就好了。这样逻辑的更新完全不影响。

@networkwx 你这问的,让 Node.js 情何以堪。 Node.js 做是嘛的,自己写一个代理就可以了,实在不行,github上应该已经有类似的 repos

@networkwx 我们现在就是自己写的上面这个代理逻辑做来更新的,使用场景与你这个基本一致。

@networkwx 可以寨一下erlang的解决方案, 没跨节点的actor就拿redis或者0mq的pubsub凑, 把handles单独抽出来, 哪部分需要更新就推送出去, 订阅者收到后eval替换掉现有的handle. 这样颗粒相对细一点吧.

自己游戏内部可以实现热发布的吧……

@ShlXue 嗯,对的!感谢感谢。

热代码替换 socket保持 然后不同的请求调用的不同的require进来的模块 模块文件改变的时候把require的cache删除重新require就可以做到了 我们游戏现在就是这样了

@frosh 兄弟,能不能详细点解析一下?我们现在游戏也需要做到热更新,但是好像比较困难,因为模块(文件)很多,他们之间很多都是相互依赖的,根据 http://fex.baidu.com/blog/2015/05/nodejs-hot-swapping/ 这个文章的提示,只能解决了所有模块之间的依赖关系,才能回收掉旧模块,才能使新的代码生效,你们是怎么做到的? 而且经过验证,require.cache 里面的依赖关系很容易就存在着环的,所以这个感觉好难解决

回到顶部