Pub/Sub Redis, могу ли я отслеживать, потребляются ли какие-либо опубликованные сообщения?

У меня есть экземпляр Redis, который публикует сообщения по разным темам. Вместо реализации сложного механизма сердцебиения (сложного, потому что экземпляр перестанет публиковать сообщения через некоторое время, если они не будут использованы), есть ли способ проверить, используются ли кем-либо пабы?

Например, экземпляр RedisServer публикует сообщения для topic1 и topic2. RedisClient1 подписывается на topic1, а RedisClient2 подписывается на topic2. Когда RedisClient2 по какой-либо причине перестанет получать сообщения от topic2, я хочу, чтобы RedisServer узнал об этом и решил, когда прекратить публиковать сообщения для topic2. Прекращение потребления topic2 непредсказуемо, поэтому я не могу сообщить RedisServer о прекращении/отказе от подписки.

Я подумал, что если бы экземпляр Redis мог узнать, потребляются ли сообщения определенной темы или нет, то это было бы очень полезной информацией.

Любая идея, возможно ли это?


person Matt    schedule 02.02.2015    source источник


Ответы (2)


Если вы используете достаточно последнюю версию Redis (> 2.8.0), эти две команды могут вам помочь:

PUBSUB CHANNELS [pattern]

В котором перечислены текущие активные каналы (= канал, имеющий хотя бы одного подписчика), соответствующие шаблону.

PUBSUB NUMSUB [chan1 ... chanN]

Который возвращает количество подписчиков для указанных каналов (однако не работает для шаблонов).

Примечание. Оба решения не позволяют определить, действительно ли сообщение было обработано! Если вам нужно знать о завершении задач (если ваши сообщения что-то запускают), я бы рекомендовал искать полномасштабную очередь заданий (например, Resque, если вы хотите придерживаться Redis).


Изменить: вот документ Redis. для всего вышеперечисленного: http://redis.io/commands/pubsub

person pysco68    schedule 02.02.2015
comment
Идеально, именно то, что я искал (мне просто нужно знать, есть ли подписчики). Спасибо @pysco68. Для тех, кто интересуется здесь реализацией, предоставленной Stackexchange.Redis: stackoverflow.com/questions/26362640/ - person Matt; 02.02.2015

Вы также можете использовать результат PUBLISH. Это даст вам количество подписчиков, получивших сообщение: http://redis.io/commands/publish

Таким образом, вам не нужно опрашивать команду PUBSUB, просто выполните логику «остановить публикацию» сообщений после публикации сообщения.

В лучшем случае вы публикуете одно сообщение без подписки.

person João Parreira    schedule 02.02.2015
comment
Я не знал об этом, это даже лучше и проще в обращении. Хотите знать, включаются ли в подсчет те, кто подписался на шаблон, соответствующий теме, в которую была отправлена ​​публикация? - person Matt; 02.02.2015
comment
Он должен включать подписки на шаблоны. Но вам все равно нужно будет время от времени опрашивать методы из моего ответа, чтобы узнать, когда вы сможете опубликовать снова (это необходимо) - person pysco68; 02.02.2015
comment
Кстати. поскольку вы, кажется, используете Stackexchange.Redis, его метод Publish возвращает количество подписчиков - person pysco68; 02.02.2015
comment
@ pysco68, насколько я понимаю, это то, о чем говорит Жоао Паррейра, что метод Publish возвращает число подписчиков. - person Matt; 02.02.2015