系统设计注意事项

张开发
2026/4/13 12:31:54 15 分钟阅读

分享文章

系统设计注意事项
避免大事务、慢事务因为事务会给数据上锁。事务中不能有接口调用、文件操作等注意更新/查询命中数据库索引避免表锁数据量大/读写量大时可以考虑分库分表、冷热隔离、读写分离、异构存储(ES、HBASE、DORIS等)、冗余字段(宽表减少表join)、固态硬盘避免死锁包含数据库/代码等常用的状态与处理模式状态待提交、待审批、已拒绝(终态)、待处理、处理中、成功(终态)、失败(终态)、不确定、转人工处理模式实时处理、准实时处理、定时处理、日终处理、人工处理等跨系统交互注意一致性、幂等性避免单边账调用外部系统状态变更API时例如转账、资金解冻、账户冻结、状态变更等先本地记录执行流水避免调用信息丢失唯一流水号作为表唯一键避免重复消费。CAS执行状态更新为处理中(并发控制)记录唯一流水号。然后再调用外部API并上送唯一流水号(对方幂等控制)。根据API返回结果更新执行状态为成功/失败/不确定(异常)。对于结果不确定(异常)的通过异步自动任务补偿对账、查询结果并更新状态或做后续处理例如结果为失败发起冲正等。 注意热点数据抢锁/竞争在合理的前提下尽可能缩小并发锁包裹的范围和粒度并减小单一锁竞争(例如用分段锁)避免并发计算错误\重复悲观锁、乐观锁、CAS比较交换、无锁并发、幂等、顺序正确(比如先收到处理成功通知后收到处理中消息)注意并发性能并行化、异步化、分治、扩容、流量削峰、缓存、限流熔断、负载均衡、CDN流量从前端-负载均衡-后端-核心系统-数据库应呈现漏斗状即流量越来越小、越来越平滑单机TPS优化合理提高tomcat线程池、连接池。数据库索引、sql调优。多级缓存。调整JVM堆内存、更换垃圾回收器(G1\ZGC)。避免OOM、STW、FULLGC。代码优化区分IO密集/CPU密集、运用合理的算法和数据结构、串行/循环/递归转并行、同步转异步、释放内存。 注意安全问题加密、验签、越权(水平、垂直) 代码设计注意隔离不变/可变依赖抽象不依赖具体、策略模式、防腐层、代理层..... 微服务拆分合理性避免简单程序复杂化。频繁联动操作的多个数据表且需要强一致性保证的可考虑尽量同一微服务同一事务处理。 复杂的系统或者业务尽可能向简单设计。拆分成多个简单的步骤、模块最后组装成一个复杂业务。保证每一个独立的方法、模块维护简单。业务复杂的接口可以做异步化拆分同步只标记为处理中剩余复杂耗时逻辑都异步处理以提高接口响应速度。异步处理/消息同步等场景注意幂等消费(只处理一次)、时序性(例如只能处理时间戳、版本号更大的数据)、状态机流向(例如状态更新从处理中-成功不能反向更新)、大量数据的批处理可以使用多线程、多进程、多机分片/分批并行处理。分片分批依据可以是 商户号、客户号、时间日/时、固定排序分页页码、预分批次号等等跨系统变更操作可以做日间/日终对账。日间对账可以通过调用对方查询接口获取单笔结果。日终对账可以下载对方对账单获取全量结果然后做日全量数据比对。考虑上线回退策略例如靠配置回退、全量回退。尽量将影响范围控制在最小。多个组件协同上线时极可能避免自己回退影响到其他组件避免强迫其他组件一起回退导致其他组件的其他功能不能正常上线。在方案设计之初各个组件就应该考虑好单一组件回退的兼容性设计做到单一组件回退不影响其他组件正常版本更新全局跟踪号从前端发起接口请求时生成上送后端流转的全局唯一标志。通过跟踪号可以确定唯一一次接口调用。在本机日志中可以通过全局跟踪号过滤出此次调用的所有日志在跨组件间调用时通过全局跟踪号过滤此次调用在各个组件中的日志和请求响应报文

更多文章