检查清单(20200510)

标签: 总结 清单 | 发表时间:2020-05-10 10:58 | 作者:coderbee
出处:https://coderbee.net

1. 逻辑代码

1.1 基础开发

1.1.1 参数校验

  • 入参基本校验:金额不能小于0、不能大于余额、不能大于应还总额等。

  • 字符串非空。

  • 请求参数用 POJO 接收,POJO 的属性要添加基本校验注解,Controller 方法要用 @Valid 注解开启校验。

  • 正则表达式:用正则表达式进行参数校验时,不能写太复杂的,因为 Java 的正则引擎采用的是贪婪匹配模式。

1.1.2 跨系统调用

  • 超时限定:为了防止外部服务出现响应缓慢而拖累调用方,调用方必须设置连接超时、读超时等。

  • 幂等性,防止重复调用:调用方传递唯一的请求编号、服务方根据请求编号进行幂等性控制;

  • 重试:对于重要业务,调用方应该有重试机制,重试一定次数后仍然失败的,有告警出来,人工介入处理。

  • 调用链跟踪:

1.2 SQL

  • 检查SQL语句的执行计划,关注是否有全表扫描、索引全扫描。

  • 尽量把 1+N 次查询改写成 1或2 次查询。

  • 不能在字段上应用函数。

  • 字段应该单独在比较运算符的左侧。

  • 检查是否有隐式类型转换

    • 隐式类型转换会对扫描到的每条记录的字段进行转换,然后再进行比较,执行性能较慢,还会导致无法使用被转换列上的索引。
    • 比如 varchar(10) 类型的字段用 abc=40 则会进行隐式类型转换, abc='40' 则不会。
    • MyBatis在处理数据库 Date 类型时只能传 TIMESTAMP。 类型,与Oracle的 Date类型进行比较会导致隐式转换。
    • MySQL 里如果比较的两个字符串列的字符集不同也会发生隐式类型转换。
  • join 的连接条件不要放到 where 子句,连接条件与过滤条件的执行顺序不同。

1.3 事务控制

  • Spring 里内调用 事务方法会导致事务不生效。

  • 事务内不能访问外部系统,特别是会导致外部系统状态改变的操作。

  • 不要混用注解驱动的事务与 JDBC Connection 。

1.4 并发

1.4.1 线程池

  • 临时创建的线程池应当在用完后就立即销毁,合理设置线程的空闲等待时间。

  • 创建线程池时应该指定 ThreadFactory 的实现,新创建的线程应该有独特的名字,方便定位问题。

  • 创建的线程数量要有上限。

  • 任务的等待队列要有边界。

  • 采用 java.util.concurrent.ThreadPoolExecutor 线程池来执行的任务之间应该是彼此独立、无依赖的。如果任务会派生并等待子任务执行完成的,使用 ForkJoinPool 更合适。

1.4.2 善于利用数据库 CAS 操作防止并发

update t_task set status = :newStatus where id = :id and status = :oldStatus

检查更新的记录数,如果为 1 表示更新成功、没有并发,否则有其他的操作修改了数据。

该语句应该在执行操作或在事务开始处执行。

2. 数据库设计

2.1 数据库

  • 最小权限原则:只给账户分配必须的最小权限。

  • 禁止在公网访问数据库。

2.2 表

  • 对于MySQL数据库,存储引擎是否是合理,一般用 InnoDB 存储引擎。

  • 字符集是否合理,一般用 utf8mb4 。

2.3 字段

  • 数据类型选择,满足需求的情况下占用存储空间尽量小。

  • 状态值、枚举值的定义是否完备。

  • 是否应该有唯一性约束。

  • 自增主键、创建时间、更新时间等必须字段是否有。

  • 时间类型的字段不要用字符串类型来存储,存储效率不高。

  • 不要在表里存储超长字段。

  • 字符串长度

    • MySQL InnoDB 引擎里,字符串长度对应的是字符集的字符数。
    • Oracle 里 varchar2 对应的是字节数。
  • 一个字段的类型在所有表里都应该保持一致,比如订单号在订单表的类型是 bigint,那么在运单表的类型也应该是 bigint 。

2.4 索引

  • 状态字段是否加了索引,特别是任务类的表。

  • 常用查询字段是否有索引。

  • 索引合理性检查。

  • 加载大量数据时,可以先禁用索引,待数据加载完后再重建索引。

  • 一个表的数据大量变更(比如大批插入或删除)后应该重新收集表、索引的统计信息。

  • 如果要更改MyQL的主键列,应当先删除二级索引、更改主键列、再创建原二级索引,因为二级索引指向的是主键索引,修改主键列会导致二级索引也修改。

  • Oracle 加索引可以开启并行来提升速度,但加约束只能单线程执行。

  • Oracle 给大表加主键或唯一性约束时,可以先添加唯一性索引,开启并行度,执行完后再把索引的并行度改为 1,然后再加约束。

3. 检查清单-其他

3.1 外部系统交互

  • 单独给每个接口设置连接超时时间、读超时时间。

  • 被调用接口支持幂等性的情况下,应考虑调用失败时自动重试有限次。

  • 重要接口调用失败应该有告警。

3.2 监控

  • 对于异步处理的逻辑应该有监控告警,及时发现处理失败的情况。

  • 异步任务未处理、处理超时、处理失败等非成功状态都应加以监控。

3.3 日志

  • 多实例部署时防止日志互相覆盖,日志文件名加入机器名或IP或时间戳等加以区别。

  • 在关键的逻辑点输出日志。

  • 日志信息要有关键字段。

  • 要打印异常栈,不能只打印信息。

3.单元测试

  • 一定要跑所有的单元测试。

  • 用断言校验结果。

  • 单元测试之间不应有依赖。


欢迎关注我的微信公众号: coderbee笔记

相关 [检查 清单] 推荐:

检查清单(20200510)

- - coderbee笔记
入参基本校验:金额不能小于0、不能大于余额、不能大于应还总额等. 请求参数用 POJO 接收,POJO 的属性要添加基本校验注解,Controller 方法要用. 正则表达式:用正则表达式进行参数校验时,不能写太复杂的,因为 Java 的正则引擎采用的是贪婪匹配模式. 超时限定:为了防止外部服务出现响应缓慢而拖累调用方,调用方必须设置连接超时、读超时等.

Web软件测试中数据输入的检查清单

- - InfoQ cn
检查清单(Checklist)可以帮测试人员节省时间,因为很多有效的方法并不需要每个测试人员重新发现,前人已经有了充分的总结,并做了大量的有效性验证,其次,检查清单可以帮助测试人员避免遗漏,人的记忆是有局限的,难免会有遗漏的地方,通过检查清单检查可以有效的防止遗漏. 最近,IBM工程师苏京刚 总结了Web软件测试中数据输入的检查清单,对Web测试人员提供了很好的参考.

Web开发者必备:Web应用检查清单

- - ITeye博客
想做一个高质量的Web应用,前前后后要做的事情非常多. 国外开发者 Ata Sasmaz 为 Web 开发者制作分享了一份检查清单,包括应用开发、性能、安全、分析、可用性、可靠性、转换策略、竞争策略这些方面需要注意的事项. 清单内容可能不全面,欢迎大家在评论中补充. JavaScript 允许捕获异常.

新项目检查清单 - Phodal | Phodal - A Growth Engineer

- -
无论是向新人介绍项目,又或者是上到一个新的项目,我们都需要事无巨细地列出一个个的关注点. 既然如此,那么为什么创建一个检查清单,用来帮助我们一个个的检查一遍呢. 在过去的日子里,经历了几个不同的项目,每个项目都有自己特有的特色. 它们往往也包含了一些不同的背景,在成功的交付项目之后,有的还要解决技术难题,有的要的是解决业务难题,有的复杂的部分在于跨团队的协作.

Java Code Review清单

- - ImportNew
使用可以表达实际意图(Intention-Revealing)的名称. DRY(Don’t Repeat Yourself)原则,(拒绝重复). 用代码来解释自己的做法(译者注:即代码注释). *参考自: http://techbus.safaribooksonline.com/book/software-engineering-and-development/agile-development/9780136083238.

LoadRunner检查点实战

- - 码农博客
久到我都不记得上一次更新博客是什么时候,久到我们博客主机都过期了,一度我还想停掉这个博客. 好在有simon的坚持才决定博客继续整下去. 2013年对我来说是一个比较折腾的一年. 找工作的时候才发现理想与现实之间的差距是如此的巨大. 期间经历了落差、失望、彷徨……. 最近一段时间给我们组成员培训LoadRunner,我自己也有所收获,也就有了这篇文章.

C++检查内存泄露

- - CSDN博客推荐文章
说明,我使用的ide是vs2008. 内存泄露的检测一般在debug模式下进行. 2.在需要检查内存泄露的cpp头部加上. 4.然后就可以在输出中看泄露情况了. 举个例子,例子中我用newEx表示的上述宏定义中的new. 输出中显示的内容(debug下运行程序,然后点叉叉关闭程序).   Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD .

Solr4.2.1 拼写检查组件

- - 寒江孤影
在做搜索时一般可以在用户输入检索条件时使用suggest,而在点击完搜索时,使用拼写检查,二者结合给可以用户带来比较好的用户体验. suggest与spellcheck看似功能一样,出发点是不一样的,使用条件也不一样,spellcheck是在没有搜索出结果时才有的功能,搜索词正确是没能spellcheck结果的,而suggest是任何情况下都有结果的.

Linux 系统安全检查

- -
对linux系统进行安全检查的方法. 1、充分利用Linux和Unix系统中内置的检查命令来检测系统. Linux和Unix系统中就很有用处: . -who,查看谁登陆到系统中; . -w,查看谁登陆到系统中,且在做什么操作; . -last,显示系统曾经被登陆的用户和TTYS; . -history,显示系统过去被运行的命令; .

我的Android Apps清单

- Qixiang - Page to Page
入手Desire Z一周多,尝试过的Android应用来来去去也有100多个了,不敢独享,特来分享 . 什么东西进入中国都有“中国特色”,在这一点上Android也不能例外,本来Google 官方好好的 Android Market,在国内又出现了数十个论坛自己所谓的市场. 在我看来,尽量只使用Android Market官方市场,毕竟有巨大的用户数量做保证(国外貌似没有这么多鱼龙混杂的市场),又有25美刀的注册费做门槛;这样一来太糟糕、恶意的应用很难藏身.