高并发服务器之泄峰

news2025/1/24 2:21:51

文章目录

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

背景

  • 行业: 车联网
  • 机器配置:阿里云服务 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.coloradmin.cn/o/433926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中的五种IO模型

Linux中有以下五种IO模型 一、同步阻塞IO(Blocking IO, BIO) 用户进程发起IO调用后就阻塞线程让出CPU,等待内核处理完毕返回结果再唤醒继续执行。 二、同步非阻塞IO(Non-Blocking IO, NIO) 用户进程发起IO调用后就…

前端研发提质增效利器,TypeScirpt成功迁移详解

点击蓝字👆 关注Agilean,获取一手干货 直播预告:Adapt 系列直播又双叒叕来啦!最新一期我们将围绕「版本分支与环境」进行深入探讨,欢迎大家来直播间和主播互动哟~ 点击下方右上角红色按钮「预约」&#x1f…

ESP32设备驱动-PAJ7620手势传感器驱动

PAJ7620手势传感器驱动 文章目录 PAJ7620手势传感器驱动2、硬件准备3、软件准备4、驱动实现PAJ7620 将手势识别功能与通用 I2C 接口集成到单个芯片中,形成图像分析传感器系统。 可识别上、下、左、右、前、后、顺时针、逆时针、挥手等9种人手手势。 它还提供内置的接近检测,以…

网络编程及项目思路

计算机和计算机之间通过网络进行数据传输 常见的软件架构: C/S:客户端/服务器 画面可以做的非常精美,用户体验好需要开发客户端,也需要开发服务端用户需要下载和更新的时候太麻烦 B/S:浏览器/服务器 不需要开发客户端,只需要…

java IO流_1

目录 分类 字节流 InputStream OutputStream 文件拷贝 字符流 FileReader FileWriter 处理流 BufferedReader BufferedWriter 文本拷贝 流是从起源到接受的有序数据,通过流的方式允许程序使用相同的方式来访问不同的输入/输出源。 分类 按数据…

SDK(动态链接库dll)的封装技巧

SDK(动态链接库dll)的封装技巧 一、说明 通过上篇文章,我们知道对于封装API,目的为了代码复用等,其中还有一个重要的原因,就是隐藏实现。 说到隐藏实现,在封装C的SDK库(动态dll库)时&#xff…

【获奖案例巡展】信创先锋之星——浙江省某市区视频能力中心

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目,星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动,旨在为各行业提供更多的优秀产品案例,彰显技术改变世界的力量&#xff0…

【id:33】【20分】C. 分数类(类与构造)

题目描述 完成下列分数类的实现: class CFraction { private: int fz, fm; public: CFraction(int fz_val, int fm_val) ; CFraction add(const CFraction &r); CFraction sub(const CFraction &r); CFraction mul(const CFraction &r);…

elementui的table组件,大量使用v-if导致列表渲染错乱,有的列渲染的值不对,有的列渲染出来的空值解决办法

记录一下: 这是同事碰上的,感觉挺奇怪的就研究了研究。 先说一下,之所以是同事那边碰到的而我这边碰不到这个问题,是因为我这边做 el-table-column 的时候,是先定义的 tableHeader: [...] 然后通过 v-for 遍历出来的…

【Linux】CentOS桥接模式配置静态IP

文章目录 1 前言2 桥接模式和NAT模式有什么区别3 校园网环境下配置桥接模式 1 前言 最近在安装的虚拟机上面用mosquitto搭建MQTT服务器,但是很奇怪的是每次电脑上的测试软件能顺利连接服务器,但是连接电脑热点的外部设备却不行,让我很是困惑。…

程序员随时担心被抛弃......大厂外包值不值得去?

外包”这个词经常被人提及,而且也经常被我们所“鄙夷”,很多人都在四处问:“软件外包公司到底能不能去”? 外包公司到底能不能学到真正的技术? 外包大厂能不能去? 今天就给大家详细分享下外包的利与弊 做…

DNS缓存失效,死循环访问造成连接数瞬间飚高的问题

0.背景介绍 某服务domain.com.cn 之前DNS解析到服务真实地址10.1.1.11,后面需要对用户登录增加黑名单功能,于是在openresty针对服务domain.com.cn的特性完成了黑名单功能。黑名单功能已经上线几个月,但是DNS从服务真实地址10.1.1.11切换到ope…

如何远程自己家里电脑

即使您认真地将数据保存到云中,远程访问家庭或办公室计算机上的计算机文件也可能会改变游戏规则。也许您正坐在旅馆房间里,需要在家用电脑上运行一个程序。 或者您出门在外,想在手机上运行桌面应用程序。 这就是远程桌面工具的用武之地。配置…

【ansj分词,英文被转换为了小写】

ansj分词,英文被转换为了小写 没有识别到词表解决方案jieba分词 没有识别到词表 因为数据是大写,词表是大写,ansj将数据转换成了小写,无法匹配,词表失效。将词表改为小写就可以成功分词。 这里ansj我们的词表就是一列…

rdma IBV_SEND_FENCE标记位理解

参考rxe驱动代码, 在rxe_req.c文件里,取wqe时,会调用req_next_wqe函数, 在函数的最后有个判断, qp->req.wait_fence设置为1,然后返回NULL,所以rxe_requester函数直接退出了,不会…

【Linux】网络编程入门(TCP + UDP)

目录简述: 前言: 一、网络通信概述 二、网络编程主要函数 (1)socket函数 (2)bind函数 (3)bind函数 (4)accept函数 (5)connect…

AttributeError: ‘LTP‘ object has no attribute ‘seg‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【Jenkins 2.x 实践指南】2.7 pipeline -- 章节小结

目录 一、 pipeline入门 1. pipeline 是什么 2. Jenkinsfile 又是什么 3. pipeline语法 的选择 4. 创建第一个pipeline - helloworld Stage 1: 创建任务 Stage 2: 创建流水线 - Hello World Stage 3: 编写 pipeline 声明 Stage 4: 执行 Stage 5: 点击 #1 查看日志 …

2023年 中国制造业这三大趋势不可忽视

政府要掏1个亿奖励制造企业搞发展,我国制造业大翻身的时代来了吗? 4月12日成都日报电,为支持制造业创新发展,支持制造业数字化、智能化和绿色化转型升级,培育高精尖特企业,政府给扶持政策不说,…

2.5亿行文本数据,导入到SqlServer需要多久?

今天测试了一下SqlServer的导入性能,数据库版本是SqlServer2008r2。 数据源是大概5000个文件,总共12.7G的大小的文本文件, 自己做的导入工具,利用多线程导入,总共耗费了大概1个小时。 导入后的总行数达到2.5亿多行&am…