Redis punsubscribe не отписаться - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть один клиент 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

1 Ответ

0 голосов
/ 27 апреля 2020

Я заметил, что есть два разных типа подписок. По каналам и шаблонам. В моем вопросе я подписывался на канал и отказывался от подписки на шаблон, эти два не «совместимы», поэтому это не будет работать. Я использовал nc для отладки, так как redis-cli не разрешит дополнительные команды при входе в подписанное состояние.

...