最近写的代码,有同事和mentor review的时候给我提出了一些意见,在这里稍微总结一下。
1. 对于同种类型的出错记录,比如增加metrics打点,也尽量将错误类型区分开。不管是来源不同,比如第三方登录的场景,需要将微信,微博出错的打点分开记录,这样方便之后统计第三方调用的出错量,也更容易定位到某个第三方平台的认证服务是否挂掉。还是结果不同,比如对于同一上游请求的处理,返回的错误代码可能是多样的,这时候就尽量也加上不同的打点,大类可以一样,但是可以在值上做处理达到区分的目的
2. 对于一些性能优化的部分要注意,比如python情况下,写一个函数判断一个uri里面是不是包含特定的地址片段。首先,尽量使用set而不要使用list,看上去复杂度只是从O(1)便到O(n)而且list里面的数量是固定的也不多,但下游服务的小复杂度被上游服务调用的时候可能是走循环的,这时候你的时空间复杂度都会成倍数的增加,因此要在每个细节上注意性能优化。还有比如uri这种问题,实际地址在库里可能存的奇形怪状的,因此判断的时候与其用(‘aaa’,’AAA’)这种形式来判断,不如用一个lower对原uri做处理,再用’aaa’去判断,这样就防止了历史bug可能引入的’aaA’这种地址。
3. 日常业务对于删除字段在数据库里往往不会置NULL,否则一个更新操作你无法判定到底是删除还是压根就没传这个参数,因此varchar往往会写空字符串,int往往会写0,所以业务里一定要注意对空字符串和0这些特殊值的处理
4. 错误处理尽量减少上抛,框架层要有重试机制,轻易不要把exception抛到业务层,业务层也尽量在自己这一层摁死,不要再往上游传了,不然同一exception的处理代码需要在不同模块写很多次,严重的资源浪费
5. 数据库的操作还是尽量带上limit 1,因为数据库往往会做分库分表,查询时候如果查的不是分片键就会去所有表里查询,查到一个以后如果不带limit 1还会接着去查其他分表造成浪费