Сначала, а затем прочитайте, Брат Нэн поможет вам получить более половины ваших навыков Java.
MIT с открытым исходным кодомRedis adapter
адаптер,События могут транслироваться на несколько отдельных socket.io Серверный узел. Этот момент связан с замечательным контентом ниже.
Я брат Нэн, лидер в изучении и развитии Java.
Думаю, это поможет вам пройти собеседование и получить предложение о работе в той компании, которую вы задумали.
Функцию прямой трансляции ПК кажется легко спроектировать, но на самом деле она совсем не проста. Геймплей Live PK появился на основных платформах, таких как Douyin, Huya и Douyu, и может помочь интернет-компаниям и ведущим заработать много денег.
Брат Нэн, сначала скажи мне, как играть в ПК? Процесс выглядит следующим образом: ведущий нажимает кнопку «Подать заявку на PK», чтобы соответствовать другим ведущим, которые одновременно подают заявку на PK. Поклонники увеличивают шкалу прогресса PK, отправляя подарки своим любимым ведущим. неудавшийся будет наказан. Но какой смысл в наказании? Несостоявшиеся ведущие тоже зарабатывают деньги.
Взгляните на общий интерфейс live pk.
Мы планируем хранить данные индикатора выполнения pk в высокопроизводительной базе данных памяти Redis. Здесь мы используем структуру Map Redis для хранения данных индикатора выполнения двух якорей pk.
# Структура k-v карты
pk:progress:pk_id = [{Якорь А : 100}, {Якорь Б : 90}]
Однако данные индикатора выполнения в основном предоставляются зрителям, которые входят в комнату прямой трансляции после запуска ПК. После того, как эти люди входят в комнату прямой трансляции, клиент вызывает интерфейс запроса прогресса ПК, чтобы получить последний индикатор выполнения ПК.
// Запрос ПК индикатор выполненияинтерфейс
public Map<Object, Object> getPKProgress(String pkId) {
String pkProgressKey = "pk:progress:" + pkId;
return redisTemplate.opsForHash().entries(pkProgressKey);
}
И пользователи в комнате прямого эфираИндикатор выполнения увеличивается,Мы разработали его для передачи данных WebSocket в режиме реального времени.,Пока прогресс якоря увеличивается,Распространите увеличенное значение для всехсуществоватьpkПользователи комнаты прямой трансляции。
но есть проблема,Если новая аудитория впервые входит в комнату прямой трансляции,,Он получил последний прогресс ПК. В это время пк прогресс определенного якоря как раз увеличился.,Но поскольку они новые зрители,Данные WebSocket не могут быть переданы этому последнему пользователю.,что делать?
Это связано с проблемами согласованности данных.!мы можемсуществовать После того, как пользователь входит в комнату прямой трансляции,Время от времени вызывайте вышеуказанный интерфейс,Получите последний индикатор выполнения ПК,руководитьКоррекция данных。
При этом после завершения пк все равно нужно один раз вызвать интерфейс запроса, чтобы гарантировать, что такой ситуации не возникнет: Эй, у хоста рейтинг явно выше, чем у нее, почему он проиграл? Эта ситуация по-прежнему является проблемой несогласованности данных.
Якорь нажимает кнопку приложения PK, и мы добавляем идентификатор якоря и информацию о комнате прямой трансляции в пул сопоставления PK.
Мы по-прежнему используем Redis для этого пула пакетов, используя один из пяти основных типов данных Redis: Zset. Элемент Zset хранит идентификатор привязки и идентификатор комнаты прямой трансляции, а оценка элемента хранит PK-очки привязки. Затем Zset отсортирует их по точкам привязки.
Далее следует разработка алгоритма сопоставления. С помощью алгоритма сопоставления + точек привязки Zset для сопоставления выбираются две привязки pk с одинаковыми точками.
# Структура Zset:
pk:matching_pool = [{anchor_id_1_room_id_1 : 100}, {anchor_id_2_room_id_2 : 110}]
Нан Ге, все эти ключевые структуры данных, приведенные выше, хранятся в Redis. Мы должны обеспечить высокую доступность Redis. Могу ли я использовать кластер Redis?
Если эта архитектура Redis будет принята,потому чтоRedisКластер делит ключевые значения на16384Слоты предоставляются каждому узлу кластера.,Рекомендуется настроить каждый узел кластера как подчиненный узел.,Прямо сейчасКластерная архитектура с моделью «главный-подчиненный»
。Предотвратить сбой определенного узла кластера, приводящий к потере всех данных.。
Каждый ПК имеет обратный отсчет. Здесь мы устанавливаем пару ключ-значение обратного отсчета в Redis, когда ПК успешно совпадает. Начальное значение пары ключ-значение — это общее время ПК этого ПК.
// Настройки обратный отсчет
public void setPKCountdown(String pkId, int totalTime) {
String pkCountdownKey = "pk:countdown:" + pkId;
// существовать Redis Установить обратный отсчет в
redisTemplate.opsForValue().set(pkCountdownKey, totalTime, totalTime, TimeUnit.SECONDS);
}
Подводя итог вышесказанному, давайте четко разберемся в конструкции всего процесса ПК.
Анкор отправляет заявку на ПК -> соответствовать -> В случае успеха WebSockett отправит уведомление об успехе и информацию об обратном отсчете. -> Создать ветку мониторинга -> зайти -> ПК урегулирование
Первые два якорясуществовать Щелчок клиентаpkКнопка «Применить»,Запрос на приложение поступает в заднюю часть,Клиент сообщает ведущему:pkсоответствоватьсередина
。
После применения якоря,Сервис задней части добавляет якорь в пул pkсоответствовать. Микросервис, специально используемый для сопоставления привязок PK, продолжает обрабатывать запросы в пуле PK.,При необходимости соедините два якоря с помощью pk.,в то же время Поставьте два якорявыгнатьpkсоответствоватьбассейн。
Конечно, после успешного завершения согласования все еще существуют последующие процессы, которые необходимо обработать.,После успешного сопряжения используйте технологию Active Push сервера WebSocket.,Сообщите хосту, включая пользователей комнаты прямой трансляции, в режиме реального времени: pk успешно подключен.
в то же время,существоватьRedisсоздать вышеРаздел 1.3
из ПК обратный отсчет, он также выдвигается на якорь, включая аудиторию одновременно.
существовать За кулисами,Нам также необходимо создатьМониторинг потока,Заходи и следи, заканчивается ли рк,ПК решение, когда будет готово,Расскажите зрителям и ведущему, кто победил.
Мониторинг потокабронировать Мониторинг потокабассейн子,удобныйПовторное использование потоков,Самым большим преимуществом пула потоков является то, что он снижает потребление ресурсов, вызванное частым созданием и уничтожением потоков в системе.
// 从Мониторинг пул потоков получает поток
public void monitorPKProgress(String pkId) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
scheduler.scheduleAtFixedRate(() -> {
// Проверьте, закончился ли обратный отсчет
String countdownKey = "pk:countdown:" + pkId;
Integer countdown = (Integer) redisTemplate.opsForValue().get(countdownKey);
if (countdown != null && countdown <= 0) {
System.out.println("ПК заканчивается, расчет начинается...");
// Логика расчета звонков
}
}, 0, 1, TimeUnit.SECONDS); // Контролируйте каждую секунду
}
pkсоответствует уведомлению об успешном выполнении, pkIndicator увеличивает выполнение и т. д., все они требуют технологии WebSocket для передачи данных в режиме реального времени.
Но в комнате прямой трансляции находятся тысячи зрителей, и большинство клиентов зрителей подключены к разным серверам WebSocket. Когда вы хотите отправить данные, как узнать, с каких серверов WebSocket их следует отправлять? ?
(1) Централизованное управление статусом соединения
Некоторые компании имеют только один фиксированный сервер WebSocket.,推送数据时绑定这台服务器изipПрямо сейчас可,Ему также не обязательно заниматься вопросами, которые мы обсуждаем.
Размещаем информацию о подключении пользователя,Включая идентификатор пользователя, адрес сервера WebSocket для длительного соединения.,Все сохраненосуществоватьRedisсерединаруководитьЦентрализованное управление статусами。Когда данные должны быть отправлены,Получите данные пользователясуществоватьWebSocket服务器地址Прямо сейчас可。
(2) Широковещательная рассылка
При отправке данных рассылайте сообщения всем серверам WebSocket. После получения широковещательного сообщения сервер проверяет, есть ли информация о подключении пользователя локально, и если да, отправляет сообщение.
(3) Структура кластера WebSocket
еслиWebSocket框架使用из是Socket.IOиз话,以上из问题已经有很好из集群解决方案了。Socket.IO Redis adapterадаптер События могут транслироваться на несколько отдельных socket.io Узел сервера, используемый для обмена статусом соединения между несколькими серверами WebSocket.
Я Брат Нэн, Нэн - это Нэн. Мне нравятся твои лайки, лайки и лайки на Get.
Творить непросто, поэтому вы можете ставить лайки, собирать и подписываться, чтобы поддержать его. Ваша поддержка — самая большая мотивация для моего творчества.❤️