一个合格的后端系统
如果
- 你需要在当前的项目里找到可以优化的点
- 你觉得目前的系统开发没有意思,但暂时也没有想跳槽和转组。
不妨从以下的角度来思考日常的工作是否有可以改进的点。
- 代码仓库
- 合理规划各种文件夹,常见有cmd、internal、utils、service、dataaccess、handlers、config、proto等文件夹
- Makefile、Scripts、gitlab CICD、gitlab
- 代码质量。如果判断你的代码质量好不好,你就想像有一个和你对立的人来review你的代码都挑不出任何一点毛病,那就合格了。
- 文档
- PRD、TRD、TD、Master TD你都会写吗?从头设计一个需求、甚至系统,每个细节都写清楚,估算API的QPS、内存使用量、估算DB的CURD压力、数据存储估算、Kafka的生产消费压力、存储估算,是否需要缓存?如果涉及核心链路(下单),是否有降级方案(fallback strategy),是否有合理的系统、业务监控,系统架构(system architecture),必要的时序图(sequence diagram),流程图(flow diagram),如果涉及迁移(migration)和弃用(deprecated)的部分是否需要提前通知上下游团队获得知情?
- 开评审会(TD/PRD Review)让产品、技术、QA、项目经理来共同评审。
- 测试
- 冒烟测试Smoking Testing/Canary,也就是系统的健康检测、连通性测试
- 单测Unit Testing,代码应当有合理的抽象,对于大部分核心链路有单测,虽然不可能达到100%(永远不可能),但可以尽可能提高单测量到70%~80%
- 集成测试Integration Testing,对于一些DB、Redis,应当有集成的测试
- 回归测试Regression Testing,使用一些线上的数据
- 数据库、缓存
- 一般都是MySQL了,需要考虑的不多。主要把索引和表sharding设计好即可。必要情况下需要考虑db sharding。
- 如果使用Redis,可以思考缓存雪崩、击穿、穿透等问题,key、value能够有多大?除了键值还可以使用什么数据结构?
- MQ(削峰填谷、异步处理、持久化请求)
- 削峰填谷:互联网系统通常会有一些突增高并发的场景,比如节日大促、秒杀,这时候就需要借助MQ来削峰填谷
- 异步处理:对于一些耗时长的请求,可以发出MQ msg后便返回,msg随后便会被consumer处理(如果频率不高且对性能要求高,可以考虑触发cronjob运行)
- 持久化请求:consumer在处理长耗时msg时有可能会宕掉,但只要其未commit消息(kafak),就能够在恢复后重新拉取msg进行处理
- 定时任务平台Cronjob
- 需要能够配置环境、区域reigon、镜像image、运行AZ、所需容器cpu cores、memory
- 能够定时精准触发、错误重试、错误报警、接入日志平台
- 配置平台(config)
- 配置中心一般大厂都有,用于配置、隔离各个环境(test、uat、staging、live)的upstream API config、feature configs、app cofigs、DB/MQ configs等
- 可观测性(Service Observability)
- 监控报警系统(monitors、alert)
- 对于系统重要的接口应当有监控(P99错误率,QPS),报警应当有Email、IM、Phone
- 对于重要的业务指标应当有业务监控,比如订单量,订单计税量
- 日志系统(log)
- 日志系统一般大厂都有,也可以自己部署开源的日志系统
- 在打log时需要合理安排INFO、ERROR、WARN、FATAL的log级别
- 需要打log的地方不要省。常规有incoming request、outgoing request的log、DB/Redis的CURD的指令log、对上游RPC/HTTP调用的log、出现特定error时的log、kafka开始消费到消费结束时的log、config的更新log、以及服务的运行log(service start、service down等)。
- tracing系统
- 监控报警系统(monitors、alert)
- 数据平台
- ingest DB into Hive table
- create ETL task
- 网关平台
- 负责DNS、ALB(Application Load balancing)、NLB(Network Load Balancing)
- RPC system
- 容灾、降级、限流、高可用、操作一致性
- 容灾:在系统某个容器、甚至某个数据中心(机房)宕掉的时候有backup容器、机器来处理
- 降级:同上情况,在出现重大灾难时如果不能够维持原有的服务,应当在系统设计时考虑好fallback的方案
- 限流:对incoming请求的QPS的限制,对outgoing请求的QPS的限制
- 高可用:在当前系统的整体CPU usage和Memory usage过高时易于(自动)扩容
- 操作一致性:对于一些需要确保要么完成、要么回滚的操作;或是对同个数据进行写操作的;应当引入合理的事务、或分布式锁(基于redis)