简要概述如何做好程序设计功能

文章目录

    • 功能设计流程图
    • 数据库设计
    • 缓存设计
    • job设计
    • 接口设计
    • 监控设计
    • 预案设计

功能设计流程图

与外部系统交互、本系统模块之间流程,比较好用的画圈软件draw .io或在线的process on

数据库设计

从DDD角度界限上下文、ER图、评审表结构设计是否合理,表的关联关系是否合理、是否创建索引、是否大数据量表考虑放到分片库以及分片字段设计

缓存设计

  • 缓存结构是否合理 redis结构选择(string、hash、 list、set):
    • 对于C端高并发接口,hash结构要慎重用,key不能用固定的key,防止key倾 斜,可以采用string结构,value尽可能压缩下,比如 {“groupId:”:“536363737”, “groupId”:“989898989”}改为"536363737#989898989",大大节省redis空间。
    • 对于数据量很大,单条valve报文很大的业务,如果经常判断某个值是否存在,可以考虑采用set结构,利用sismember方法,时间复杂度O(1)
  • 缓存过期时间是否合理:不能怕脑袋胡乱给一个时间,如果存放的数量,过期时间一定要给短一些,比如2日分钟或半小时,否则增长很长,打爆redis
  • 缓存是否设计考虑预热和重建机制
  • 缓存中尽可能不能使用delete命令;delete会阻塞redis,特别是存放数量很大的hash、set、list, 容易阻塞redis,引1发事故,替换方案:expire -1
  • 是否是否设计二级缓存;本地缓存+分布式缓存,实现方式caffine或quavatredis,对于数据量不大热点数据(一般1W条以下,单条报文10kb以下,比如网点数据、航线数据)可以放本地缓存,这些热点数据查询非常频繁,容易造成redis倾斜,本地缓存可以抗这种高井发流量.
  • 防穿透处理
    • 提供c端的接口,查询不到数据,尽可能不要穿透到数据库,防止打爆数据库,查不到一定记得打印告營日志,及时人工千预
    • 提前将数据预热到缓存中(系统启动预热或者运营后台有手动刷新缓存按钮或者有个job刷缓存)

job设计

  • job逻辑要考虑幂等设计
  • job逻辑尽可能轻量级,不要太重,导致执行逻辑很久(如果确实逻辑比较复杂,可以分拆job或者从代码层面优化,例如:分批井行处理、减少单次处理数据〕
  • 构建数据到缓存类似的job,尽可能选择时间在晚上12点以后,尽量不要白天进行,因为白天流量很大,重建缓存容易引起接口抖动
  • 对于定时执行的job,设计执行时间的时候,要慎重考虑线上整个job执行的时间,根据这个时间配置cron表达式,不要拍脑袋随意设置,
  • 不然本次job没执行完,下一次job执行的时候容易错过。
  • 对于大表数据(百万、千万甚至亿级),可以利用xxjob、saturn等分布式调度框架的分片处理能力,并行刷数据,提供处理速度。

接口设计

  • 高并发接口必须在测试环境压测,清楚的知道接口支持的QPS,另外根据压测报告给出的优化建议,及时调整线上的配置、代码优化。
  • 提供给C端的接口,要清楚曝光位省、然后根据接口可能预计调用的流量、压测的接口最大支持的QPS,决定是否扩容、是否需要限流及兜底逻镇、是否熔断
  • 程序中涉及的异常信息,及时配置错误监控告警,遇事做到心中有数。
  • 对于业务关键位置,及时打印info级别的业务追踪日志,如果是高并发接口,要做好开关,能秒级关闭,因为打印日志也特别耗性能。
  • 程序设计方面,高井发接口,尽可能使用缓存、能异步就异步 (一般用mq,不要用多线程异步)、 尽可能采用无锁设计防止线程Lock CPU冲高,批量写库
  • 接口前置逻铜提前,尽早过滤掉不合规運银,缩短接口整个调用链路时长,提升接口整体吞吐量。
  • 接口要考虑无状态设计、昇等设计(考虑分布式锁唯—key)、安全设计(接口方法签名、是否接第三方防刷服务判断是否黑产用户)

    无状态服务:客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份。服务端不保存任何客户端请求者信息
    有状态服务: 即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如 tomcat 中的 session

  • 对第三方服务做到零信任,考虑降级、熔断,与业务方确认好兜底逻辑处理。
  • 工具类尽可能使用apache、google等出的、 一些github小众的开源框架很多在高井发场最有bug和性能瓶颈。
  • 接口的时间复杂度,部分在设计的时候尽可能保证是0 (1),例如调用第三方接口,for循环调用的,是否可以提到缩环外,传多个id批量调用一次,时间复杂度从0(n)降为0(1)

监控设计

  • 核心接西做好监控,例如:调用量上涨/下跌80%、接口健康度监控 (5分钟error超过100次、5分钟接口超过1s 100日次、5分钟不可用次数超过1000次)
  • 应用监控,例如:应用cpu、内存层、gc、繁忙线程数、数据库连接池连接数监控告警
  • 中间件监控,例如:redis可用性、cpu-内存-流量-大key-热key-慢查询监控、kafka可用性-消息积压情况-丢失率监控告警
  • 数据库监控,例如:mysql cpu、慢sql监控告警
  • 业务监控,例如:发券量暴涨或暴跌、活动注册人数同比或环比异常

预案设计

设计预案减少损失

  • 设计全局开关(系统接近不可用,通过配置中心全局开关快速切断接口流量,保证系統可用)
  • 遇到系统故障,非核心功能通过配置中心开关下线,保证整体服务可用
  • 应用能自动扩容(这里就要求应用做到无状态设计,比如:我们之间有一些应用有调用加密机,但是新应用节点需要申请白名单,这种设计方式就没法自动扩容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826337.shtml

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

相关文章

力扣287. 寻找重复数

Problem: 287. 寻找重复数 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 利用二分查找搜索1 ~ n中重复的元素,我们每次取出当前二分查找的区间的中间元素mid并在元始的数组nums中统计小于mid的元素的个数count: 若count > mid则说明重复的…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月20日,星期六

每天一分钟,知晓天下事! 2024年4月20日 星期六 农历三月十二 1、 证监会:调降基金股票交易佣金费率,年度降幅测算将达38%,7月1日起实施。 2、 民政部举办全国“乡村著名行动”培训班,助力乡村振兴。 3、…

OJ刷题日记:4、滑动窗口(2)

目录 1、904.水果成篮 2、438.找到字符串中所有字母异位词 3、30.串联所有单词的子串 4、76.最小覆盖子串 1、904.水果成篮 题目: 904. 水果成篮 - 力扣(LeetCode)https://leetcode.cn/problems/fruit-into-baskets/description/ 你正在…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

机器学习和深度学习的区别

机器学习与深度学习的区别 一、原理差异二、应用差异三、实现方式差异四、在实际应用中扮演的角色1、图像识别和计算机视觉2、自然语言处理NLP3、语音识别领域4、其它—智能制造/医疗健康/金融/教育 五、总结 在人工智能领域&#xff0c;机器学习和深度学习是两个重要的概念&am…

Springboot框架——3.整合SpringMVC

1.修改端口号&#xff1a; 在application.properties中添加如下配置即可&#xff1a; server.port8088 2.静态资源访问&#xff1a; 首先打开ResourceProperties这个类的源码&#xff1a; 将静态资源放到类中默认位置即可实现访问&#xff1a; http://localhost:8088/erth.jp…

HCIE-Shell实验1

要求&#xff1a; 判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。判断web服务是否运行(1、査看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行)&…

小红书情感博主暴力玩法,流量巨大,客单300+

这个项目的盈利核心在于提供情感咨询服务&#xff0c;每笔交易的利润通常在200到300元之间&#xff0c;这种方式比撰写大量情感内容来吸引流量要简单得多&#xff0c;可以说是一种快速超车的策略。 项 目 地 址 &#xff1a; laoa1.c n 我们以男性的视角提供感情建议&a…

OpenHarmony其他工具类—libharu [GN编译]

简介 libharu主要用于生成 PDF格式文件。 下载安装 直接在OpenHarmony-SIG仓中搜索libharu并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/libharu 修改添加依赖的编译脚本&#xff0c;路径&#xff1a;/developtools…

Linux的firewalld防火墙

介绍firewalld&#xff1a; ①、firewalld&#xff08;Dynamic Firewall Manager of Linux systems&#xff0c;Linux系统的动态防火墙管理器&#xff09;服务是默认的防火墙配置管理工具&#xff0c;它拥有基于CLI&#xff08;命令行界面&#xff09;和基于GUI&#xff08;图…

Modelsim与Verilog入门

0.什么是Modelsim&#xff1f; Modelsim是一个支持多语言的仿真环境&#xff0c;比如我知道的Verilog和VHDL语言都可以在里边使用&#xff0c;这俩都是硬件描述语言&#xff1b; 即就是个软件&#xff0c;你可以用Verilog语言来写代码&#xff0c;然后编译&#xff0c;仿真出…

【IEEE出版 | 中山大学主办 | 往届会后2-4个月EI检索】第五届电子通讯与人工智能学术会议(ICECAI 2024)

第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09; 2024 5th International Conference on Electronic communication and Artificial Intelligence 第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09;将于2024年5月31日-6月…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

MATLAB 点到平面距离的简易计算 (61)

MATLAB 点到平面的垂直距离 (61) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 一行代码计算点到平面的距离,下面是MATLAB版本的实现方法, 使用一组自定义的点和平面验证,结果表明计算正确: 二、算法实现 1.代码 代码如下(示例): % 定义点的坐标 point = …

7.3 哈希表与布隆过滤器(入门)—— C语言实现

文章目录 前言一、哈希表1.1 哈希函数1.2 哈希冲突 二、布隆过滤器布隆过滤器的工作原理&#xff1a;存储空间与元素数量的关系&#xff1a;结论&#xff1a; 三、哈希表的代码演示3.1 哈希表扩容 四、总结参考文献 前言 本章内容参考海贼宝藏胡船长的数据结构与算法中的第七章…

算法课程笔记——集合set

3复杂度不稳定 删一个和删除全部 注意iter是类 遍历是无序的

半导体材料(三)——P-N结和金属-半导体接触

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第三篇笔记&#xff0c;上一篇传送门。 p-n结和金属-半导体接触 p-n结 无偏压开路状态 如图a所示&#xff0c;左边是n型掺杂&#xff0c;右边是p型掺杂&#xff0c;在n区和p区之间形成了一个不连续的…

【MATLAB基础绘图第21棒】绘制比例弦图 (Chord Diagram)

MATLAB绘制比例弦图 Chord Diagram 1 简介1.1 弦图简介1.2 比例弦图简介 2 MATLAB绘制比例弦图2.1 数据准备2.2 基本绘制2.3 添加方向箭头2.4 添加绘图间隙2.5 添加刻度2.6 修改标签2.7 颜色设置2.8 弧块及弦属性设置2.8.1 弧块属性设置2.8.2 弦属性设置 2.9 字体设置 参考 1 简…

【Qt 学习笔记】Qt常用控件 | 显示类控件Label的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件Label的使用及说明 文章编号&#xff1a;Qt 学…

C++必修:从C语言到C++的过渡(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是C C&#xff08;c plus plus&#xff09;是一种计算机高级程序设计语言&…