【问题标题】:How does memory work across Heroku dynos?Heroku dynos 的内存是如何工作的?
【发布时间】:2016-03-22 08:41:50
【问题描述】:

假设我在节点中有一个动态创建的数组,我在 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 弱映射可以跨其他测功机创建。

heroku 能否跨越每个测功机的这些变量?还是我需要使用其他数据结构(例如数据库)来保存信息?

【问题讨论】:

    标签: node.js heroku


    【解决方案1】:

    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 的?
    • 没有,但很快就会在 blog.heroku.com 上发布(我们即将发布一篇博文,其中包含有关在 Heroku 上跨 dynos 和粘性会话使用 socket.io 的演示) )
    猜你喜欢
    • 2013-04-28
    • 2014-10-10
    • 1970-01-01
    • 2014-07-19
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多