Node.js 集群共享缓存

Posted

技术标签:

【中文标题】Node.js 集群共享缓存【英文标题】:Node.js Cluster Shared Cache 【发布时间】:2020-04-18 17:50:28 【问题描述】:

我正在使用节点缓存来创建本地缓存,但是,我遇到的问题是,当使用带有 PM2 的应用程序来创建应用程序集群时,缓存会被创建多次,每个进程一个 - 这不是问题太大了,因为缓存的数据很小,所以内存不是问题。

真正的问题是我有一个 API 调用我的应用程序来刷新缓存,但是当调用这个 API 时,它只会刷新处理该调用的特定进程的缓存。

有没有办法向所有工作人员发出信号以执行一项功能?

我确实考虑过使用 Redis 来缓存,因为这样可以更简单地只拥有一个缓存,我对 Redis 的问题是我不确定扩展它的最佳方式,我目前有 50应用程序并且不想为每个应用程序设置一个新的 Redis 数据库,替代方法是使用 ioredis 并且它是每个应用程序的透明密钥前缀,但是如果一个应用程序意外读取数据,这可能会导致一些安全漏洞其他客户端应用程序 - 我不相信有一种方法可以删除特定前缀(即一个应用程序/客户端)的所有键,因为 FLUSHALL 将删除所有键

为集群节点实例共享缓存的最佳实践是什么,但应用程序的实例也很多 - 想想 SAAS 应用程序。

目前,我针对此问题的解决方法是使用 node-cron 每 15 分钟清除一次缓存,但是,缓存中的某些项目实际上永远不会更改,并且还有其他项目应尽快更新外部工具通过 API 调用通知应用程序刷新缓存

【问题讨论】:

michal pavlik 发布了一个Answer 说“你可以试试这个可以在进程中存储数据的包:npmjs.com/package/pm2-cluster-cache” 【参考方案1】:

对于任何看到这个的人,对于我的用例,最好的方法是使用 IPC。

我实现了一个 IPC messenger 来将消息传递给所有进程,我从 pm2 配置文件 (app.json) 中读取了进程名称,以确保我们将消息发送到正确的应用程序

// Sender
// The sender can run inside or outside of pm2
var pm2 = require('pm2');
var cfg = require('../app.json');

exports.IPCSend = function (topic, message) 
    pm2.connect(function () 
        // Find the IDs of who you want to send to
        pm2.list(function (err, processes) 
            for (var i in processes) 
                if (processes[i].name == cfg.apps[0].name) 
                    console.log('Sending Message To Id:', processes[i].pm_id, 'Name:', processes[i].name)
                    pm2.sendDataToProcessId(processes[i].pm_id, 
                        data: 
                            message: message
                        ,
                        topic: topic
                    , function (err, res) 
                        console.log(err, res);
                    );
                
            

        );
    );




// Receiver
// No need to require require('pm2') however the receiver must be running inside of pm2
process.on('message', function (packet) 
    console.log(packet);
);

【讨论】:

以上是关于Node.js 集群共享缓存的主要内容,如果未能解决你的问题,请参考以下文章

Node.js多服务器集群:如何在多个节点集群中共享对象

使用PM2管理Node.js集群

Node.JS、Socket.IO 和集群中的 WebSocket 握手不起作用

Node.js使用PM2的集群将变得更加容易

Node.js进程管理之Process模块

Node.js缓存