Node.js 集群共享缓存
Node.js Cluster Shared Cache
我正在使用节点缓存来创建本地缓存,但是,我遇到的问题是,当将应用程序与创建应用程序集群的 PM2 一起使用时,缓存会创建多次,每个进程一个 - 这个问题不大,因为缓存的数据很小,所以内存不是问题。
真正的问题是我有一个 API 调用我的应用程序来刷新缓存,但是当调用此 API 时,它只会刷新处理该调用的特定进程的缓存。
有没有办法向所有工作人员发出信号以执行功能?
我确实考虑过使用 Redis 进行缓存,因为这样可以让只有一个缓存更简单,我对 Redis 的问题是我不确定扩展它的最佳方式,我目前有 50 个应用程序并且不想为每个应用程序设置一个新的 Redis 数据库,替代方法是使用 ioredis 并且它是每个应用程序的透明键前缀但是如果一个应用程序要不小心从其他客户端应用程序读取数据——我不相信有一种方法可以删除特定前缀(即一个 app/client)的所有键,因为 FLUSHALL 将删除所有键
什么是集群节点实例共享缓存的最佳实践,但也有很多应用程序实例 - 想想 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);
});
我正在使用节点缓存来创建本地缓存,但是,我遇到的问题是,当将应用程序与创建应用程序集群的 PM2 一起使用时,缓存会创建多次,每个进程一个 - 这个问题不大,因为缓存的数据很小,所以内存不是问题。
真正的问题是我有一个 API 调用我的应用程序来刷新缓存,但是当调用此 API 时,它只会刷新处理该调用的特定进程的缓存。
有没有办法向所有工作人员发出信号以执行功能?
我确实考虑过使用 Redis 进行缓存,因为这样可以让只有一个缓存更简单,我对 Redis 的问题是我不确定扩展它的最佳方式,我目前有 50 个应用程序并且不想为每个应用程序设置一个新的 Redis 数据库,替代方法是使用 ioredis 并且它是每个应用程序的透明键前缀但是如果一个应用程序要不小心从其他客户端应用程序读取数据——我不相信有一种方法可以删除特定前缀(即一个 app/client)的所有键,因为 FLUSHALL 将删除所有键
什么是集群节点实例共享缓存的最佳实践,但也有很多应用程序实例 - 想想 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);
});