ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-09-05 13:02:39  阅读:178  来源: 互联网

标签:缓存 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,监控,要点,设计
来源: https://www.cnblogs.com/hjwcore/p/16657717.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有