[ОБНОВЛЕНИЕ]: Текущий 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);
}
Это оригинальный текст вопроса, который не является правильным:
Насколько я понимаю, мне нужно:
Для данного канала найдите узел, которому принадлежит слот хеша.
Подписаться на этот узел, а также на кластер: слоты для обнаружения миграций.
После миграции слота подпишитесь на канал на новом узле и оставьте старое соединение открытым.
Пересылать сообщения приложению от старого соединения до его закрытия и запоминать эти сообщения.
Когда миграция завершена и старое соединение закрыто, пересылайте сообщения с нового соединения, обрезая запомненные сообщения.
с первого соединения.
Кто-нибудь из клиентской библиотеки golang redis делает это? Я просмотрел
многие, и мне кажется, что я должен написать эту логику сам, постоянно
опрос CLUSTER SLOTS
или прослушивание в пабе этой информации, чтобы узнать
когда осколки увеличиваются или уменьшаются и перемещают мой существующий паб
сценарии с одного сервера на другой.
т.е. есть много библиотек Голанга, которые обрабатывают нормальный ключ GET с кластером
даже если количество осколков меняется. Но Pubsub и кластер является
совсем другое дело, верно?