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