首页 > 其他分享 >D_07 高并发系统的设计开发要点

D_07 高并发系统的设计开发要点

时间:2022-09-05 12:56:26浏览次数:63  
标签:缓存 07 是否 接口 并发 job 监控 要点 设计

一、产品需求澄清、pm排期和任务分解

二、开发设计评审(研发、测试参与)

(1)功能设计流程图

  采用亿图图示梳理:系统与外部系统交互、系统模块之间流程、核心功能流程图

(2)数据库设计

  从DDD角度界限上下文、er图、评审表结构设计是否合理、是否创建索引、数据量级别、是否需要分库分表、分布式分片

(3)缓存设计

  1)缓存结构是否合理(string、hash、list、set),优秀实践:

  • 对于c端高并发接口,hash结构需要慎用、key不能用固定key、防止key倾斜、可以采用string结构,value尽可能压缩,尽量节省空间;
  • 对应数据量很大,单条value报文很大的业务,如果经常判断某个值是否存在,可以采用set的结构,利用sismember方法,时间复杂度o(1)缓存过

  2)缓存过期时间是否合理(要结合业务确定时间,如果数据量很大,过期时间可以设置短一些,20/30分钟,防止redis被打爆)

  3)缓存是否需要考虑预热或者重试机制

  4)是否设计二级缓存(本地缓存+分布式缓存),对于数据量不大的热点数据(一半一万条以下,单条报文10kb以下,比如网点数据,可以放本地缓存,这些热点数据查询非常频繁,容易造成redis倾斜,本地缓存可以抗衡这种高并发流量)

  5)缓存穿透处理

  • 提供C端的接口,查询不到数据,尽量不要穿透到数据库,防止打爆数据库,查询不到一定记得打印告警日志,及时人工干预; 2)提前将数据预热到缓存中(系统启动预热或者运营后台有手动刷新缓存按钮或者job刷新缓存)

(4)job设计

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

(5)接口设计

  • 高并发接口必须在压测环境进行压测,清楚知道接口的qps,另外根据压测报告给出优化的建议,及时调整线上配置及进行代码优化。
  • 提供给c端的接口,要清楚知道曝光的位置、然后根据接口调整可能预计调用的流量,压测接口最大支持的qps,决定是否扩容、是否需要限流及兜底逻辑、是否降级、是否熔断。
  • 程序中涉及的异常信息,及时配置错误监控告警,遇事做到心中有数。
  • 对于业务关键位置,及时打印info级别的业务追踪日志,如果是高并发接口,要做好开关,能秒级关闭,因为打印日志也特别损耗性能。
  • 程序设计方面,高并发接口,尽可能使用缓存,能异步就异步(一般使用mq,不要使用多线程异步)、尽量使用无锁设计防止线程lock cpu冲突,批

(6)数据库

  • 接口前置逻辑提前,尽早过滤不合规逻辑,缩短接口整个调用链路时长,提升接口整体吞吐量;
  • 接口要考虑无状态设计,幂等性设计(考虑分布式唯一key)、安全设计(接口方法签名、是否接第三方防刷服务判断是否是黑产用户)
  • 对第三方服务做到0信任,考虑降级熔断,与业务方确认好兜底逻辑处理;
  • 工具类尽可能采用知名的、成熟的、有社区、持续维护的框架;
  • 接口的时间复杂度,部分逻辑在设计的时候尽可能保证是0(1),例如第三方调用接口,for循环调用的是否可以提到循环外,通过批量获取,将时间复杂度从0(n)降到0(1)

(7)监控设计

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

(8)预案设计

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

 

标签:缓存,07,是否,接口,并发,job,监控,要点,设计
From: https://www.cnblogs.com/hjwcore/p/16657717.html

相关文章

  • 关于系统并发数和QPS的思考
    并发数表示同时请求的用户/线程数。QPS表示每秒执行的请求数。例如在预估秒杀系统需要支持的QPS时:并发数表示可能参与秒杀的线程数(约等于用户数,但是也要考虑是否有......
  • P2261 [CQOI2007]余数求和
    P2261[CQOI2007]余数求和分析求的式子为\(ans=\sum_{i=1}^{n}k\%i\),我们首先需要知道的是\(a\%b=a-b*\left\lfloor\frac{a}{b}\right\rfloor\),则式子就变成了。......
  • Java并发编程之synchronized 与 volatile
    synchronized同步代码块一般使用Java的synchronized关键字来实现,有两种方式对方法进行加锁操作;第一处,在方法签名处加synchronized关键字;第二,使用synchronized(对象......
  • 1072. 按列翻转得到最大值等行数
    给定 mxn 矩阵 matrix 。你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从0变成1,或者从1变为0。)返回经过一些翻转后,行与行之......
  • Rust常用并发示例代码
    记录几个常用的并发用法:1、如何让线程只创建1次先看一段熟悉的java代码:voidmethod1(){newThread(()->{while(true){System.out.pri......
  • 并发学习记录10:共享模型之无锁
    一个小例子引入importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.atomic.AtomicInteger;interfaceAccount{IntegergetBalance......
  • C++学习笔记-day07
    1、引用......
  • P2776 [SDOI2007]小组队列题解
    需要解决的问题1.如何将小组中的元素插进去?2.如何按顺序输入。思路显然,这个题的名字就是小组队列,并根据题意及样例,我们可以比较容易的想到队列这个东西。首先......
  • 并发学习记录09:共享模型之内存
    Java内存模型JMM指的是Javamemorymodel,它定义了主存,工作内存等抽象概念,相当于做一个隔离层,将底层CPU寄存器,缓存,硬件内存,CPU指令优化提供的功能通过一个简单接口给使用......
  • 学习 Go,一段旅程:标准库包和并发 #5
    学习Go,一段旅程:标准库包和并发#5大家好!很高兴再次见到你,我希望你做得很好。在本文中,我想分享我在学习Go编程语言方面的进展。本周,我了解了标准库包和并发。标准库包......