Heroku dynos之间的内存如何工作?

3
假设我在Node中创建了一个动态数组,并且将其运行在Heroku Dyno上:
var connections = [];
var wm = new WeakMap();

io.sockets.on('connection', function(socket) {

    socket.once('disconnect', function() {
        connections.splice(connections.indexOf(socket), 1);
        socket.disconnect();
        console.log("Disconnected: %s sockets remaining.", connections.length);
    });

    socket.on('idAndApi', (data) => {
        wm.set(socket, data);
    });

    connections.push(socket);
    console.log("Connected: %s sockets connected.", connections.length);
});

现在,connections数组和wm弱引用可能会被创建在其他的dynos上。

Heroku能否跨越每个dyno来覆盖这些变量?还是我需要使用其他数据结构(如数据库)来保存信息?

1个回答

2
"Dynos是独立的,节点进程应该是无状态的(这在任何环境中都是正确的,包括Heroku)。
将状态存储在外部位置,以便最好地管理和共享适合您的应用程序。Redis和Postgres是两个常见的node系统。
由于您正在使用socket.io,请确保按照他们的指南跨越多个节点:"

http://socket.io/docs/using-multiple-nodes/


我看到它提供了一个简单的示例: var io = require('socket.io')(3000); var redis = require('socket.io-redis'); io.adapter(redis({ host: 'localhost', port: 6379 })); 但是,是否有更详细的示例,特别是关于Heroku的? - E.S.
目前还没有,但很快会在blog.heroku.com上发布(我们即将发布一篇博客文章,演示如何在Heroku上使用socket.io跨dynos并具有粘性会话)。 - hunterloftis
@hunterloftis 七年过去了,关于那篇博客文章有什么更新吗?我有一个在nodejs上运行并使用heroku的游戏,它将状态保存在内存中。但是我每天都会遇到heroku dynos重新启动的问题,这会导致所有玩家被强制退出游戏。我有点担心使用redis会给游戏引入延迟,但我正在阅读相关资料时看到了这个评论。 - temporary_user_name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接