我正在使用 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/