Проект неинтересный? Тогда давайте изучим проектирование функции PK.
Проект неинтересный? Тогда давайте изучим проектирование функции PK.

Сначала, а затем прочитайте, Брат Нэн поможет вам получить более половины ваших навыков Java.

MIT с открытым исходным кодомRedis adapterадаптер,События могут транслироваться на несколько отдельных socket.io Серверный узел. Этот момент связан с замечательным контентом ниже.

Я брат Нэн, лидер в изучении и развитии Java.

Думаю, это поможет вам пройти собеседование и получить предложение о работе в той компании, которую вы задумали.

1. Дизайн функции Live PK

1.1пк геймплей

Функцию прямой трансляции ПК кажется легко спроектировать, но на самом деле она совсем не проста. Геймплей Live PK появился на основных платформах, таких как Douyin, Huya и Douyu, и может помочь интернет-компаниям и ведущим заработать много денег.

Брат Нэн, сначала скажи мне, как играть в ПК? Процесс выглядит следующим образом: ведущий нажимает кнопку «Подать заявку на PK», чтобы соответствовать другим ведущим, которые одновременно подают заявку на PK. Поклонники увеличивают шкалу прогресса PK, отправляя подарки своим любимым ведущим. неудавшийся будет наказан. Но какой смысл в наказании? Несостоявшиеся ведущие тоже зарабатывают деньги.

Взгляните на общий интерфейс live pk.

1.2 ПК индикатор выполнения

Мы планируем хранить данные индикатора выполнения pk в высокопроизводительной базе данных памяти Redis. Здесь мы используем структуру Map Redis для хранения данных индикатора выполнения двух якорей pk.

Язык кода:java
копировать
# Структура k-v карты
pk:progress:pk_id = [{Якорь А : 100}, {Якорь Б : 90}]

Однако данные индикатора выполнения в основном предоставляются зрителям, которые входят в комнату прямой трансляции после запуска ПК. После того, как эти люди входят в комнату прямой трансляции, клиент вызывает интерфейс запроса прогресса ПК, чтобы получить последний индикатор выполнения ПК.

Язык кода:java
копировать
// Запрос ПК индикатор выполненияинтерфейс
public Map<Object, Object> getPKProgress(String pkId) {
    String pkProgressKey = "pk:progress:" + pkId;
    return redisTemplate.opsForHash().entries(pkProgressKey);
}

И пользователи в комнате прямого эфираИндикатор выполнения увеличивается,Мы разработали его для передачи данных WebSocket в режиме реального времени.,Пока прогресс якоря увеличивается,Распространите увеличенное значение для всехсуществоватьpkПользователи комнаты прямой трансляции。

но есть проблема,Если новая аудитория впервые входит в комнату прямой трансляции,,Он получил последний прогресс ПК. В это время пк прогресс определенного якоря как раз увеличился.,Но поскольку они новые зрители,Данные WebSocket не могут быть переданы этому последнему пользователю.,что делать

Это связано с проблемами согласованности данных.!мы можемсуществовать После того, как пользователь входит в комнату прямой трансляции,Время от времени вызывайте вышеуказанный интерфейс,Получите последний индикатор выполнения ПК,руководитьКоррекция данных

При этом после завершения пк все равно нужно один раз вызвать интерфейс запроса, чтобы гарантировать, что такой ситуации не возникнет: Эй, у хоста рейтинг явно выше, чем у нее, почему он проиграл? Эта ситуация по-прежнему является проблемой несогласованности данных.

1,3 ПК соответствия

Якорь нажимает кнопку приложения PK, и мы добавляем идентификатор якоря и информацию о комнате прямой трансляции в пул сопоставления PK.

Мы по-прежнему используем Redis для этого пула пакетов, используя один из пяти основных типов данных Redis: Zset. Элемент Zset хранит идентификатор привязки и идентификатор комнаты прямой трансляции, а оценка элемента хранит PK-очки привязки. Затем Zset отсортирует их по точкам привязки.

Далее следует разработка алгоритма сопоставления. С помощью алгоритма сопоставления + точек привязки Zset для сопоставления выбираются две привязки pk с одинаковыми точками.

Язык кода:java
копировать
# Структура Zset:
pk:matching_pool = [{anchor_id_1_room_id_1 : 100}, {anchor_id_2_room_id_2 : 110}]

Нан Ге, все эти ключевые структуры данных, приведенные выше, хранятся в Redis. Мы должны обеспечить высокую доступность Redis. Могу ли я использовать кластер Redis?

Если эта архитектура Redis будет принята,потому чтоRedisКластер делит ключевые значения на16384Слоты предоставляются каждому узлу кластера.,Рекомендуется настроить каждый узел кластера как подчиненный узел.,Прямо сейчасКластерная архитектура с моделью «главный-подчиненный»。Предотвратить сбой определенного узла кластера, приводящий к потере всех данных.。

1.4 ПК обратный отсчет

Каждый ПК имеет обратный отсчет. Здесь мы устанавливаем пару ключ-значение обратного отсчета в Redis, когда ПК успешно совпадает. Начальное значение пары ключ-значение — это общее время ПК этого ПК.

Язык кода:java
копировать
// Настройки обратный отсчет
public void setPKCountdown(String pkId, int totalTime) {
    String pkCountdownKey = "pk:countdown:" + pkId;
    
    // существовать Redis Установить обратный отсчет в
    redisTemplate.opsForValue().set(pkCountdownKey, totalTime, totalTime, TimeUnit.SECONDS);
}

1,5 шт. технологическое проектирование

Подводя итог вышесказанному, давайте четко разберемся в конструкции всего процесса ПК.

Анкор отправляет заявку на ПК -> соответствовать -> В случае успеха WebSockett отправит уведомление об успехе и информацию об обратном отсчете. -> Создать ветку мониторинга -> зайти -> ПК урегулирование

Первые два якорясуществовать Щелчок клиентаpkКнопка «Применить»,Запрос на приложение поступает в заднюю часть,Клиент сообщает ведущему:pkсоответствоватьсередина

После применения якоря,Сервис задней части добавляет якорь в пул pkсоответствовать. Микросервис, специально используемый для сопоставления привязок PK, продолжает обрабатывать запросы в пуле PK.,При необходимости соедините два якоря с помощью pk.,в то же время Поставьте два якорявыгнатьpkсоответствоватьбассейн。

Конечно, после успешного завершения согласования все еще существуют последующие процессы, которые необходимо обработать.,После успешного сопряжения используйте технологию Active Push сервера WebSocket.,Сообщите хосту, включая пользователей комнаты прямой трансляции, в режиме реального времени: pk успешно подключен.

в то же время,существоватьRedisсоздать вышеРаздел 1.3из ПК обратный отсчет, он также выдвигается на якорь, включая аудиторию одновременно.

существовать За кулисами,Нам также необходимо создатьМониторинг потока,Заходи и следи, заканчивается ли рк,ПК решение, когда будет готово,Расскажите зрителям и ведущему, кто победил.

Мониторинг потокабронировать Мониторинг потокабассейн子,удобныйПовторное использование потоков,Самым большим преимуществом пула потоков является то, что он снижает потребление ресурсов, вызванное частым созданием и уничтожением потоков в системе.

Язык кода:java
копировать
// 从Мониторинг пул потоков получает поток
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);  // Контролируйте каждую секунду
}

1.6 Проблема с длинным соединением WebSocket

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.

Нажмите здесь. «JavaSouth» — это загадочный документ, в котором описываются основные знания, необходимые Java-программистам, и ключевые моменты собеседований.

Я Брат Нэн, Нэн - это Нэн. Мне нравятся твои лайки, лайки и лайки на Get.

Творить непросто, поэтому вы можете ставить лайки, собирать и подписываться, чтобы поддержать его. Ваша поддержка — самая большая мотивация для моего творчества.❤️

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose