美文网首页
代码常见小问题总结

代码常见小问题总结

作者: MrWho0 | 来源:发表于2020-10-26 16:13 被阅读0次

代码常见小问题总结

  1. 涉及资金时的防刷、限量、防重(28)
    长链路防重:
    一个接口涉及到多个支付接口;根据统一的商户订单号,可以实现唯一订单号的幂等处理。可能出问题:调用支付新生产了支付订单号,然后一个商品订单产生了多个支付订单导致多次支付。
    建议:a. 使用相同的业务订单号贯穿到最后的资金通路,避免重复资金操作;
    b. 调用支付前生成订单号,先落地,再调第三方;重复处理时用上次生成的订单号直接支付。
    c. 避免上游错误的依赖过多导致复杂度提升、如bosswlb.cfg送了之前相同流水号,导致实际未成功但上游认为成功,幂等时的响应区分重复成功交易及正常成功交易

  2. 交易判重处理
    一般的交易系统,判重基本都是通过数据库的唯一索引判重。目前做法很多都是先查询库,如果记录为0,再执行后续操作。会导致高并发下性能;且有可能查询时不存在,入库时数据失败导致失败的问题。
    建议利用数据库的主键约束直接抛异常

  3. 库存问题避免不必要的悲观锁
    在库存问题或者额度问题,用悲观锁锁先select...from...for udpate,然后判断剩余库存或额度是否足够,足够再取扣额度。导致高并发时由于锁的原因性能非常差
    建议:a.利用数据库的行锁,update ... set stock=stock-buy_num where id=* and stock-buy_num>0,高并发下,如果库存不足更新失败,影响条数为0; b.秒杀等场景引入分布式锁或者队列

  4. Spring的声明事务不生效问题
    在项目中某些如更新数据库记录同时要记录操作日志的场景,需要把入库及更新做为一个事务。如果在我们的一个业务类中调用同一个类中加了@Transactional注解的方法,会发现事务不生效。
    建议Spring AOP无法切本类的方法,通过外部类调用该类加了@Transactional的目标方法。

  5. 索引不合理
    有多列查询时建了多个单列索引,存在问题:多个单列索引占用更多空间,可能导致更新慢的问题;多个单列索引在多条件查询时优化器会选择最优索引策略,可能只有一个索引用上也可能多个索引都用上。
    Mysql(5.7.20)
    联合索引本质:当创建**(a,b,c)联合索引时,相当于创建了(a)单列索引,(a,b)的联合索引以及(a,b,c)的联合索引。
    建议:a.数据量少的字段不需要加索引;b.避免使用or连接条件,如果or连接的条件,一个字段没有索引,就会放弃索引产生全表扫描;c.联合索引比每个列分别索引有优势;d.能用唯一索引就用唯一索引而不是普通索引。

  6. bean中写成员变量导致线程不安全
    在写业务逻辑时会因为一些参数传递问题在@service、@Compent等加了这些注解的类中添加成员变量。由于Spring的bean默认是单例的,从而导致高并发时的线程安全问题。
    建议:Spring的bean中不要写成员变量

  7. 重复代码问题
    项目中有大量重复代码主要会导致两个问题:a.修改时很容易修改一处忘记修改另外一处;b.代码并不是完全重复,而是相似度高,修改时容易改成一样从而改错。
    建议:利用工厂模式+模板方法模式,消除重复代码 和if...else。

  8. 没有必要的public方法
    代码中不需要声明为public的方法被声明为public,导致问题:a.后续代码不容易重构,因为不清楚方法被哪些类调用;b.不应该被访问的方法被访问了,引起生产问题。
    建议:不确定是否需要public就不声明为public;一个.java文件只包含一个public类,可以有多个非public类。

  9. 关于性能压测:基于之前在我们项目组的压测经验,提供两个建议:a.关闭日志,即日志级别error后压测和之前对比;b.用arthas工具在测试环境检查各个方法的执行时间。

  • 其它待整理注意代码点:
    防刷:
    短信接口被刷,重复多次调用的场景;
    建议:平台资源,考虑单人限量、全局限量、流程识别、人机识别等手段;
    限量:
    因平台Bug有大量用户领取高额优惠券,并立即下单使用;
    建议:有发放计划、申请批次,然后通过批量生产资产。达到限量、有审计、有追溯的目的。
    多用组合少用继承
    减少代码的侵入性
    公共代码权限控制,应该单例但是代码没有控
    对中间件的依赖,依赖过多导致复杂度提升、如redis、mq等
    防sql注入
    敏感数据保存
    针对已有逻辑的优化改造的评判标准,优化前后系统可用性是否提高。理论上可分析
    技术组件包@Bean需要扫描的问题,是否必要,开源包可参考的地方

  • 参考 Java业务开发常见错误100例

  • 关于我-张东涛,工作六年

相关文章

  • 代码常见小问题总结

    代码常见小问题总结 涉及资金时的防刷、限量、防重(28)长链路防重:一个接口涉及到多个支付接口;根据统一的商户订单...

  • iOS 常见的代码小问题

    1.textView的光标在textView的中间位置 (解决办法) self.automaticallyAdju...

  • 常见小问题

    1.几个img标签放在一起的时候,有些浏览器会有默认的间距,加了通配符也不起作用 使用float属性为img布局(...

  • 常见小问题

    textView控制字数输入: 真机运行报错 解决办法:Xcode-preference-Accounts-找到相...

  • 常见小问题

    1.我想在字典里插入一个整数,但是一直失败。NSInteger类型的变量不允许写进字典里,只能用NSString转...

  • 常见小问题

    使用npm成功安装命令后,执行时却报找不到命令的问题 如何使用node进行广播 2019.03.09这两天学习微信...

  • iOS小问题总结

    iOS小问题总结

  • 小问题代码

    1.野指针定位 1 野指针应该大多数都是没有容错或者调用没有地址的对象或者方法导致的 上面是能定位到地址的CLAS...

  • 代码常见问题总结

    cell的contentview是有10像素的间隔的 masonry的使用必须是相对于某个视图的某条边界设置值。 ...

  • java web小问题总结

    title: java web小问题总结tags: java,web,小问题grammar_cjkRuby: tr...

网友评论

      本文标题:代码常见小问题总结

      本文链接:https://www.haomeiwen.com/subject/jtoamktx.html