有没有一种方法可以处理订阅客户端中与侦听/取消订阅/退出无关的工作负载?

时间:2019-09-19 18:22:08

标签: node.js redis publish-subscribe

我的订阅客户端没有从事与收听/取消订阅/退出无关的工作。工作量要求订阅者客户端根据发布到渠道的消息执行数据库读取。

我有一个接受大型上传文件的表单,该文件可以通过API传输给第三方服务。上传文件后,我将dataSet保存为redis“哈希”。成功保存文件后,我将“哈希”键发布到通道。

/*
    "message" (channel, message)
    Client will emit message for every message received that 
    matches an active subscription. Listeners are passed the channel 
    name as channel and the message as message.
*/

worker.on('message', (channel, BatchID) => {

    worker.HGETALL(BatchID, function(err, value) {
        if (err) (console.log(err))  
        //make an external API call to dump the object stored in value                                     
    }); 
});

要求订阅的客户端使用已发布的密钥来获取保存为“哈希”的数据集,以进行后续处理。但是,这是我得到的结果:

ReplyError: ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT 
allowed in this context

我很想通过引入“取​​消订阅”操作来解决此问题,如下所示:


worker.on('message', (channel, message) => {
    /*
        ensure subscribe client isn't doing work unrelated to exclusively 
        listening/unsubscribing/quitting. so unsubscribe after the 
    */
    worker.unsubscribe(channel, (error, count) => {
        if (error) {
            throw new Error(error);
        }
    });

    worker.HGETALL(message, function(err, value) {
        if (err) (console.log(err))  
        //make an external API call to dump the object stored in value 
        //this is a simple test
        for (var property1 in value) {            
            console.log(property1);     
        }                             
    }); 
});


但是上述方法意味着该频道的所有出版物都将丢失。

使用Redis PUB / SUB功能解决此问题的最佳方法是什么?

0 个答案:

没有答案