Swoole - практика решения системы обмена мгновенными сообщениями службы поддержки клиентов WebSocket
Swoole - практика решения системы обмена мгновенными сообщениями службы поддержки клиентов WebSocket

Обзор

Служба веб-сокетов, основанная на Swoole, четвертая часть предыдущей серии систем сообщений, реализует более сложные бизнес-сценарии, заключающиеся в улучшении и оптимизации отправки сообщений. Сам код представляет собой процесс непрерывной самооптимизации.

План реализации

Технический план реализации Основная мысльPMQ,2групповой клиент(клиент、Терминал управления обслуживанием клиентов),Состоит из трех основных частей (Push-push-сообщения + Pull-непрочитанные сообщения + очередь сообщений MessageQueue).,См. приведенную выше блок-схему архитектуры для конкретных процессов и методов взаимодействия.

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

2. Распределение службы поддержки клиентов: распределение службы поддержки клиентов основано на том, вводит ли пользователь ссылку в первый раз. Первый раз будет случайным образом распределен в одну из онлайн-служб поддержки клиентов. Если ранее назначенная служба поддержки клиентов также находится в сети, оптимизированная. существует распределение для обслуживания клиентов. Вот как оно обрабатывается. Причина в том, что служба поддержки не чувствительна к изменениям в составе пользователей, что предотвращает повторные операции соединения/отключения и снижает нагрузку на сеть.

3. Одновременная блокировка: один и тот же пользователь одновременно имеет состояние блокировки 3 с, которое используется для предотвращения путаницы в отношениях. Когда клиент отправляет запрос, сначала получается кеш, и вероятность доступа к базе данных снижается, что улучшается. стабильность и производительность сервиса.

Язык кода:txt
копировать
//Устанавливаем распределенную блокировку, которую можно запросить только один раз в течение 3 секунд.
$lock = RedisPool::invoke(function (Redis $redis) use ($toUid) {
    return $redis->get(Category::$openLock . $toUid);
}, self::REDIS_CONN_NAME);


if ($lock) {
    $msgErrorRet['code'] = 416;
    $msgErrorRet['msg'] = 'Please try again';
    return $this->response()->setMessage(json_encode($msgErrorRet));
}

//Запрашиваем, есть ли связь
$imUserRelation = RedisPool::invoke(function (Redis $redis) use ($toUid) {
    $redis->setEx(Category::$openLockPrefix . $toUid, 3, $toUid);
    return $redis->get(Category::$imUserRelationName . $toUid);
}, self::REDIS_CONN_NAME);

4. Служба обработки и переработки сетевых исключений. В случае сбоев приложений и ненормальных отключений сетевых ссылок активно отслеживайте отключенный файловый диск, выполняйте обработку отношений, перезапускайте все отключенные веб-сокеты и очищайте отношения.

Язык кода:txt
копировать
static function onClose(\swoole_server $server, int $fd, int $reactorId)
{
    $info = $server->getClientInfo($fd);
    $fd = intval($fd);
    if ($info && $info['websocket_status'] === WEBSOCKET_STATUS_FRAME) {
        TaskManager::getInstance()->async(function () use ($fd) {
            RedisPool::invoke(function (Redis $redis) use ($fd) {
                //Утилизация пользователя
                $uid = $redis->hGet('PUSH_MSG_SOCKET_FD', $fd);
                if (isset($uid) && !empty($uid) && is_numeric($uid)) {
                    $redis->zRem('PUSH_MSG_USER_LOGIN', $fd);
                    //Определить, есть ли отношения обслуживания клиентов, которые не были отключены
                    $redis->del(Category::$imUserRelationName . $uid);
                    $redis->hDel('PUSH_MSG_SOCKET_FD', $fd);
                }
                //Утилизация пользователей управления службой поддержки клиентов
                $cUid = $redis->hGet('PUSH_CUSTOMER_MSG_SOCKET_FD', $fd);
                if (isset($cUid) && !empty($cUid)) {
                    $redis->zRem('PUSH_CUSTOMER_MSG_USER_LOGIN', $fd);
                    $redis->hDel('PUSH_CUSTOMER_MSG_SOCKET_FD', $fd);
                }
            }, 'redis');
        });
    }
}

5. Получите алгоритм распределения автономных сообщений, повторно соберите автономные сообщения по пользователям в соответствии с количеством онлайн-администраторов службы поддержки клиентов и равномерно распределите их между онлайн-администраторами. Если число не может быть разделено поровну, это не приведет к неравномерному распределению.

Язык кода:txt
копировать
//Проверяем, что администратор службы поддержки клиентов онлайн
$vUid = [];
$server = ServerManager::getInstance()->getSwooleServer();
foreach ($virtualUid as $fd => $vid){
    $info = $server->getClientInfo($fd);
    if ($info && $info['websocket_status'] == 3) {
        $vUid[$fd] = $vid;
    }
}

if (!empty($pullData) && !empty($vUid)) {
    $uIds = array_keys($pullData);
    $row = ceil(count($uIds) / count($vUid));
    $share = array_chunk($uIds, $row, true);
    $keyDict = $vUid;
    $pushList = [];
    // code Ассемблерный код немного... 
}

6. Объект веб-сокета не перерабатывается: при открытии нового окна из консоли будет добавлен новый объект веб-сокета. Позже, когда он обновится в браузере, способ его перезапустить не будет найден.

7. Heartbeat. Контрольный сигнал веб-сокета службы поддержки клиентов использует push-сообщения в реальном времени, которые циклически повторяются каждые 5 секунд, чтобы предотвратить разрыв соединения и переход службы в автономный режим.

Практика ловушек в Свуле

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

Что-то не так с памятью. Скорее всего, что-то не так с моим сценарием выполнения. Я удалил оператор изменения конфигурации и добавил unset в базовый класс, чтобы вовремя освободить память.

Решение проблемы заключалось в том, что я добавил конечную длительность в скрипт Crontab, из-за чего процесс жизненного цикла PHP в режиме cli не запускался. Просто правильно используйте сопрограмму в Swoole.

Язык кода:txt
копировать
ini_set('memory_limit', '1024M');
set_time_limit(0);

Достижения

За 2 года с момента запуска он обновлялся и оптимизировался 5 раз. У него более 100 000 активных пользователей, максимальное пиковое значение — 6 Вт/с, посещаемость — 130 Вт/ч. Это очень успешный практический результат.

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

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