想收集“如果当时”,“那就”的故事,也可以给大家初建项目时作为个参考。
欢迎大伙分享
我后悔“一开始就测试写太多,代码写的太完善”,就是大家说的 'premature optimization'。
因为和客户聊后,发现需求变来变去,一开始写的很多测试都白写了,浪费了大量时间。
我后悔“一开始为什么不在每张表里创建 UUID 这个字段”
作为企业级应用,给前端返回数据时,用 integer id 很危险,很容易被人按照顺序爬数据,暴露了不属于当前客户的资源。
如果用 uuid,即使自己不小心写了有问题的代码,UUID 可以作为第二道防线。
架构设计,log,监控,压测,灰度方案,回滚方案,限流,降级方案,扩容方案。
除了架构设计,基础服务好的话,做起来很方便,没有的话,就很麻烦。
权限是要加的,scope 也是要加的,比如 company.resources.find_by()
uuid 可以保证第二道防线。
我后悔“打印日志时上下文信息太少了,无法排查问题”
# bad
logger.error("vendor API failed")
# good
logger.error({user_id: id, msg: "vendor API failed", response: santized_vendor_api_response})
我后悔“没有给每条 SQL 加上 API 备注,当 DB 出现问题时,无法快速排查这些 top sql 或者 slow sql 来自哪个 API/Job”
marginalia gem 可以给每条 sql 加备注,rails 7 就内建了~
我后悔“没有配置 rack-timeout 的 wait_timeout,当 db 短暂地出现问题,导致所有 API 响应慢,puma 的 request queue 开始疯狂堆积,每个 API response time 越来越慢”
db 恢复后,也只能通过重启所有 containers 来清理 request queue
我后悔“没有给 redis 配置 retry delay 时间,当 redis 响应时间抖动一下,所有 redis client 都立即重试,导致 redis cpu usage 涨至 +90% ”