Есть ли способ обработки рабочей нагрузки в клиенте подписки, не связанный с прослушиванием / отпиской / выходом? - PullRequest
0 голосов
/ 19 сентября 2019

Мой клиент подписки не выполняет работу, не связанную с прослушиванием / отпиской / выходом.Рабочая нагрузка требует, чтобы клиент подписки выполнял чтение базы данных на основе сообщения, опубликованного на канале.

У меня есть форма, которая принимает большие загруженные файлы для передачи через 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?

...