У меня есть один клиент redis для pub-sub. Я использую обработчик сообщений websocket для динамической подписки на канал redis. Полезная нагрузка сообщения websocket содержит идентификатор, который я использую для создания имени канала. Так например lobby:${lobbyID}:joined
. Подписка на этот канал работает нормально, сообщения публикуются при публикации на этом канале.
Но проблема в том, что я хочу отписаться от этого канала в один момент. Мое предположение, читая документацию redis, заключается в том, что я бы использовал punsubscribe
, чтобы я мог отписаться от любых каналов с шаблоном lobby:*:joined
, но сообщения все еще принимаются после попытки этого.
import redis from 'redis';
const subClient = redis.createClient();
subClient.on('message', (channel, message) => {
// Received message x on channel y
});
const socketHandlerSubscribe = (lobbyID) => {
subClient.subscribe(`lobby:${lobbyID}:joined`);
}
const socketHandlerUnsubscribe = () => {
subClient.punsubscribe('lobby:*:joined'); // true
}
При использовании redis-cli
шаблон кажется действительным при использовании PUBSUB CHANNEL lobby:*:joined
. Я мог бы решить эту проблему, передав идентификатор лобби также обработчику отмены подписки, но punsubscribe
должно быть решением для него.
Я также столкнулся с этим ранее со сценарием, в котором я просматривал массив идентификаторов пользователей и создавал подписку для каждого на statuses:${userID}
и пробовал punsubscribe
на statuses:*
, но безуспешно.
Я делаю что-то не так или это проблема, связанная с переадресацией узла? Я использую версию Redis 2.8.0