接口幂等性问题

【问题描述】
用户在使用APP的时候,页面非常的卡顿,就会随便狂点,由于接口没有做重复提交,会出现好几个相同的请求,在service层,一个线程没有insert完成,另一个线程一查,空的。于是也插入一条进来。原本每个人一条的,某个业务员出现了三条,导致业务逻辑错误。对于恶意提交的处理,在前端部分是可以搞定,在后端部分也可以有成熟的解决方案的。

【解决办法】
1、使用唯一性约束解决事务的幂等性问题,设置唯一性约束,如果出现重复提交的场景,在数据库层面会抛出唯一性约束的异常,业务逻辑不会被破坏。多个字段的组成的唯一性约束也可以。
http://www.caosh.me/be-tech/idempotence-using-unique-key/

上面是在数据库层面做防重复设置。

2、在代码层面实现防重复设置。很多时候说,通过数据库的唯一性约束会影响数据插入的效率,因为每次插入的时候,在数据库层面都要做一次判断。所以就从代码层面上进行判断,代码层面常用的就是先select再insert,但是如果高并发场景下, 还是会出现重复提交的情况。可以给逻辑代码加上同步锁synchronized,这样在高并发场景下,先select 再insert是生效的。但是效率不高,并行变成串行了。 可以使用DCL锁机制。(有没有发现跟单例模式下创建单一对象采用的方法很像,先判断对象是否存在,如果不存在就创建,否则不创建),自然DCL锁机制上,效率更高。

#分布式锁

还可以使用分布式锁来解决,常用的有Redis和Zookeeper。 这里讲解如何使用Redis实现分布式锁。
Redis中存在setNx命令操作,如果不存在就set值,并且返回1。存在就不set,并且返回0。
利用了Redis单线程特性,把高并发的场景,通过消息队列给变成串行的。
不过分布式锁有坑,需要注意。
https://www.cnblogs.com/austinspark-jessylu/p/8043726.html
3、mvcc机制?

3.1 什么是MVCC机制
MVCC是一种多版本并发控制机制。

3.2 能够解决什么问题
锁机制可以控制并发操作,但是其系统开销较大,而使用MVCC可以在大多数情况下代替行级锁,能够降低其系统开销,提高性能。

https://blog.csdn.net/whoamiyang/article/details/51901888

4、消息中也存在幂等性问题

比方说消息的重复消费,如何防止?

在MQ中消息中间件中,这些一定要弄懂,弄透的。

你可能感兴趣的:(【JAVA语言】)