高并发服务器之泄峰

news/2024/7/23 9:20:32 标签: 高并发服务器, 车联网, 泄峰, 削峰, swoole

文章目录

      • 背景
      • 前言
      • 解决方案
      • 泄峰结果
      • 总结
      • 代码示例

背景

  • 行业: 车联网
  • 机器配置:阿里云服务 8核 16G内存 3M带宽 阿里云操作系统
  • 单台server接入设备:5w
  • 终端产品:GPS定位设备
  • 终端与平台通信方式:TCP长链

前言

近期服务器每到高峰的时候,就会有很多的处理不过来的任务队列被积累,这种任务长期被积累的话,不能及时响应终端时,终端任务无法链接,就又重新发起TCP链接,这将导致恶性循环,最后服务器会被拖垮,也无法与终端进行通信。

解决方案

在不改变现有服务器硬件环境下、代码相对改动比较少,同时能允许部分数据丢弃的情况下,使用“泄峰”方法来处理在高峰期,无法正常响应终端的问题。

泄峰

  • 使用规则:
    1. 在保证设备能链接,能正常下发指令到终点
    2. 允许部分数据被丢弃
  • 泄峰策略:
    1. 丢弃哪些数据?
    2. 丢弃频率?

丢弃哪些数据
丢弃哪些不主要影响业务的数据,且这些数据的交互非常频繁。以我们现有的数据来说,主要有3大类数据比较频繁:

  1. 心跳数据
  2. 定位数据
  3. 透传数据

针对以上分析,对每类数据进行单独控制,根据实际情况进行单独泄峰,同时记录丢弃的数量,以便进行统计参考。

丢弃频率
丢弃频率,可根据业务进行调整,可在高峰期手动执行脚本泄峰,也可以使用crontab进行每隔多少分钟进行,或自己写频率脚本。

目前,我采用的配置是,泄峰时长为2分钟,每3分钟进行泄峰

泄峰结果

CPU
load
file
file

总结

泄峰的主要目的是,在高峰期,为了服务能正常稳定的运行,而采取的丢弃一部分数据的策略。具体的使用可根据自身的业务场景进行。

代码示例

泄峰配置:

return [
    'HEART_HY' => 120, // 单位秒
    'HEART_JT' => 120, // 单位秒
    'LOCATION_HY' => 120, // 单位秒
    'LOCATION_JT' => 120, // 单位秒
    'BMS_HY' => 120, // 单位秒
    'BMS_JT' => 120, // 单位秒
];

泄愤控制:

    /**
     * 获取泄峰值, 如果是要泄峰,同时记录泄峰次数
     * @param $modul: 要泄峰的模块: HEART LOCATION BMS
     * @return bool: true: 泄峰  false: 不泄峰
     * @throws \RedisException
     */
    public static function getLeakPeakValue($modul) {
        $pool = self::getAliveRedisPoolInstance();
        $redisInstance = $pool->get();
        $key = "LEAK_PEAK_VALUE_$modul";
        $value = $redisInstance->get($key);

        if(!empty($value)) {
            $inc_key = "${key}_inc_" . date("Y-m-d");
            $redisInstance->incr($inc_key);
            $redisInstance->expire($inc_key, 86400);
        }

        $pool->put($redisInstance);
        return !empty($value);
    }
    
    /**
     * 设置泄峰值
     * @param $value
     * @param $ex
     * @return void
     * @throws \RedisException
     */
    public static function setLeakPeakValue($modul, $ex) {
        $pool = self::getAliveRedisPoolInstance();
        $redisInstance = $pool->get();
        $key = "LEAK_PEAK_VALUE_$modul";
        $redisInstance->set($key, 1, $ex);
        $pool->put($redisInstance);
    }

博客:http://blog.uwenya.cc/1275.html
ChatGPT注册


http://www.niftyadmin.cn/n/240326.html

相关文章

Android系统异常问题分析(死机,重启,无法启动,启动异常等)

Android系统异常问题处理流程(死机,重启,无法启动,启动异常等) 1 addr2line工具 作用:把native的出错堆栈信息对应到代码的行数 通过find . -name * addr2line来搜索这个工具 查看出错的堆栈信息&#xff0…

vue3项目使用pdf.js插件实现文本复制、文本搜索内容高亮展示

文章目录 一、pdf.js介绍二、实现pdf预览的两种方式1、使用viewer.html2、将PDF文件渲染成Canvas 一、pdf.js介绍 官网地址:http://mozilla.github.io/pdf.js/ PDF.js是基于HTML5技术构建的,用于展示可移植文档格式的文件(PDF),它可以在现代…

深度学习 - 40. N-Gram 采样与 Session 数据获取 For EGES

目录 一.引言 二.订单数据预处理 1.数据样例 2.订单数据处理 3.用户 Session 构建 三.构造 sku_id 游走序列 1.获取完整 Session List 2.统计 sku_id 转移词频 3.构建 sku_id 图 4.游走构造 sku 序列 四.商品侧信息预处理 1.读取商品信息 2.Left Join 匹配侧信息 …

音游判定原理详解——从触摸屏幕到判定音符【Project SEKAI攻略】

“音乐游戏”一般简称为“音游”,玩家需要配合音乐的节奏来进行一定的动作。 《Project SEKAI》作为一个“移动端音游”,绝大多数玩家会使用手机、平板电脑等移动设备的触摸屏进行游玩,也有极少数的玩家不按常理出牌,使用手台、键…

文件导入导出

文件导出 当涉及到大文件导入和导出时,使用高效的代码非常重要,以避免出现内存溢出等问题。下面是两个高效的大文件导入导出的代码案例。 大文件导入 在导入大文件时,通常可以采用逐行读取数据的方式,以避免将整个文件读入内存…

设计模式-行为型模式之观察者模式

3. 观察者模式 3.1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多…

什么是机器学习?

目录 简介 机器学习可以做什么 机器学习未来的趋势 总结 简介 机器学习是一种人工智能领域中的技术,其主要目的是让计算机能够自动进行模式识别、数据分析和预测。 机器学习的起源可以追溯到20世纪50年代,当时美国的Arthur Samuel在一篇论文中提出了相关…

C#中用程序代码修改了datagridview中的数据,保存时只对光标当前行有保存解决办法

C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法 长江黄鹤 2017-06-26 | 300阅读 | 1转藏 转藏全屏朗读分…