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 集群共享缓存的主要内容,如果未能解决你的问题,请参考以下文章