[ОБНОВЛЕНИЕ]: текущий Redis отправляет каждое опубликованное сообщение на каждый узел во всем кластере:
/* -----------------------------------------------------------------------------
* CLUSTER Pub/Sub support
*
* For now we do very little, just propagating PUBLISH messages across the whole
* cluster. In the future we'll try to get smarter and avoiding propagating those
* messages to hosts without receives for a given channel.
* -------------------------------------------------------------------------- */
void clusterPropagatePublish(robj *channel, robj *message) {
clusterSendPublish(NULL, channel, message);
}
Это оригинальный текст вопроса, который неверен:
Насколько я понимаю, мне необходимо:
По заданному каналу найдите узел, которому принадлежит хэш-слот.
Подпишитесь на этот узел, а также на слоты cluster: для обнаружения миграций.
После миграции слота подпишитесь на канал на новом узле и оставьте старое соединение открытым.
Пересылайте сообщения в приложение из старого соединения, пока оно не закроется, и запомните эти сообщения.
Когда миграция завершена и старое соединение закрыто, пересылайте сообщения из нового соединения, удаляя запомненные сообщения из первого соединения.
Делает ли это какая-нибудь клиентская библиотека golang redis? Я просмотрел многих, и мне кажется, что мне нужно написать эту логику самостоятельно, постоянно опрашивая
CLUSTER SLOTS
или слушая эту информацию в pubsub, чтобы знать, когда сегменты увеличиваются или уменьшаются, и перемещать существующие сценарии pubsub с одного сервера на другой.Т.е. существует множество библиотек golang, которые обрабатывают обычный ключ GET с кластером, даже если количество шардов изменяется. Но pubsub и cluster - это совсем другое, верно?