Служба веб-сокетов, основанная на Swoole, четвертая часть предыдущей серии систем сообщений, реализует более сложные бизнес-сценарии, заключающиеся в улучшении и оптимизации отправки сообщений. Сам код представляет собой процесс непрерывной самооптимизации.
Технический план реализации Основная мысльPMQ,2групповой клиент(клиент、Терминал управления обслуживанием клиентов),Состоит из трех основных частей (Push-push-сообщения + Pull-непрочитанные сообщения + очередь сообщений MessageQueue).,См. приведенную выше блок-схему архитектуры для конкретных процессов и методов взаимодействия.
1. Установите связь, изучите принцип трехстороннего рукопожатия TCP, добавьте новую связь для каждого пользовательского запроса и освободите связь, когда запрос закончится, поскольку случайно назначенная служба поддержки клиентов каждый раз непоследовательна, администратор службы поддержки клиентов консоль, введите элемент управления. Платформа запустит программу для обнаружения отношений сопоставления обслуживания клиентов, чтобы гарантировать уникальность отношений.
2. Распределение службы поддержки клиентов: распределение службы поддержки клиентов основано на том, вводит ли пользователь ссылку в первый раз. Первый раз будет случайным образом распределен в одну из онлайн-служб поддержки клиентов. Если ранее назначенная служба поддержки клиентов также находится в сети, оптимизированная. существует распределение для обслуживания клиентов. Вот как оно обрабатывается. Причина в том, что служба поддержки не чувствительна к изменениям в составе пользователей, что предотвращает повторные операции соединения/отключения и снижает нагрузку на сеть.
3. Одновременная блокировка: один и тот же пользователь одновременно имеет состояние блокировки 3 с, которое используется для предотвращения путаницы в отношениях. Когда клиент отправляет запрос, сначала получается кеш, и вероятность доступа к базе данных снижается, что улучшается. стабильность и производительность сервиса.
//Устанавливаем распределенную блокировку, которую можно запросить только один раз в течение 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. Служба обработки и переработки сетевых исключений. В случае сбоев приложений и ненормальных отключений сетевых ссылок активно отслеживайте отключенный файловый диск, выполняйте обработку отношений, перезапускайте все отключенные веб-сокеты и очищайте отношения.
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. Получите алгоритм распределения автономных сообщений, повторно соберите автономные сообщения по пользователям в соответствии с количеством онлайн-администраторов службы поддержки клиентов и равномерно распределите их между онлайн-администраторами. Если число не может быть разделено поровну, это не приведет к неравномерному распределению.
//Проверяем, что администратор службы поддержки клиентов онлайн
$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.
ini_set('memory_limit', '1024M');
set_time_limit(0);
За 2 года с момента запуска он обновлялся и оптимизировался 5 раз. У него более 100 000 активных пользователей, максимальное пиковое значение — 6 Вт/с, посещаемость — 130 Вт/ч. Это очень успешный практический результат.
Использование простейшего метода внедрения технологий для экономии корпоративных затрат, снижения затрат на разработку и обслуживание систем, а также повышения эффективности работы офиса — это то, что должны делать технические специалисты. Будьте техническими людьми, которые решают реальные сложные бизнес-решения и реализуют их, Эн.