所以,我一直在从其他语言学习JS/Node的方式。
我有一个小型微服务,它从redis通道读取,将其暂时存储在工作通道中,进行处理,然后删除并继续。如果通道中还有更多内容,则立即重新运行。如果没有,则设置超时并在1秒后再次检查。
它可以正常工作...但是超时轮询似乎不是"正确"的方法来处理这个问题。而且我没有找到关于在Node中使用BRPOPLPUSH来阻塞(与RPOPLPUSH相对)和等待的信息...或者其他类似的选项。(Pub/Sub在这里不可用...这是唯一的侦听器,并且它可能并不总是在侦听。)
以下是我正在做的简短要点:
var Redis = require('ioredis');
var redis = new Redis();
var redisLoop = function () {
redis.rpoplpush('channel', 'channel-working').then(function (result) {
if (result) {
processJob(result); //do stuff
//delete the item from the working channel, and check for another item
redis.lrem('channel-working', 1, result).then(function (result) { });
redisLoop();
} else {
//no items, wait 1 second and try again
setTimeout(redisLoop, 1000);
}
});
};
redisLoop();
我感觉我可能忽略了什么非常显然的东西。谢谢!
PUBLISH
一些东西(比如一个空字符串),以便在在线但处于睡眠状态时唤醒该应用程序。 - Wander Nauta