我的订阅客户端没有从事与收听/取消订阅/退出无关的工作。工作量要求订阅者客户端根据发布到渠道的消息执行数据库读取。
我有一个接受大型上传文件的表单,该文件可以通过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功能解决此问题的最佳方法是什么?