Node.js 集群共享缓存

标签 node.js caching redis pm2 node-cluster

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

真正的问题是我对我的应用程序进行了 API 调用以刷新缓存,但是在调用此 API 时,它只会刷新处理该调用的特定进程的缓存。

有没有办法向所有 worker 发出信号以执行一项功能?

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

共享集群 Node 实例缓存的最佳实践是什么,但也有许多应用程序实例 - 想想 SAAS 应用程序。

目前,我针对此问题的解决方法是使用 node-cron 每 15 分钟清除一次缓存,但是,缓存中的某些项目并没有真正发生变化,还有其他项目应该在使用外部工具后立即更新通过 API 调用通知应用程序刷新缓存

最佳答案

对于任何人来说,对于我的用例,最好的方法是使用 IPC。

我实现了一个 IPC 信使来将消息传递给所有进程,我从 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 集群共享缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59523102/

相关文章:

redis - 将现有的 redis 缓存实例与 elasticache 一起使用

redis - 如何设计来自 SQS 的自动分配内容?

javascript - 在不同端点加载 javascript 文件

azure - Azure API 管理可以根据请求负载进行缓存吗?

node.js - 使用 nodejs 和 jsonwebtoken 的登录示例 : can't read the token verification result

python-3.x - 在 Prefect 中,可以在流程运行期间缓存任务值吗?

scala - 如何从 Play 缓存中获取对象(scala)

amazon-web-services - m4.large AWS 实例上的 Redis 性能

javascript - npm 错误! FetchError : request to http://registry. npmjs.org/webpack-dev-server 失败,原因 : connect ECONNREFUSED 127. 0.0.1:8000

node.js - 最小化 Node.js 服务器之间的延迟和带宽使用