如何避免表单的重复提交?(如何设计幂等性接口)

关于怎么实现承载更多用户量的系统,一直是我重点关注的一个技术方向。改造架构提高承载力,通常来讲分为两个大方向,互相配合实现。

硬件架构改进,主要是使用阿里云这种多组件的云环境:通过负载均衡SLB,模版克隆的云服务器ECS,云数据库RDS,共享对象存储OSS等不同职责的云产品组合实现。

软件架构优化,主要是软件代码开发的规范:业务解耦合,架构微服务,单机无状态化,文件存储共享等

在分布式系统的学习途中也不断见识新的知识点,今天要说的就是软件开发时候对于接口服务的“幂等性”实现!

福利:这次面试稳了!看完50本面试总结后

幂等性

效果:系统对某接口的多次请求,都应该返回同样的结果!(网络访问失败的场景除外)

目的:避免因为各种原因,重复请求导致的业务重复处理

重复请求场景案例:

1,客户端第一次请求后,网络异常导致收到请求执行逻辑但是没有返回给客户端,客户端的重新发起请求

2,客户端迅速点击按钮提交,导致同一逻辑被多次发送到服务器

简单来划分,业务逻辑无非都可以归纳为增删改查!

对于查询,内部不包含其他操作,属于只读性质的那种业务必然符合幂等性要求的。

对于删除,重复做删除请求至少不会造成数据杂乱,不过也有些场景更希望重复点击提示的是删除成功,而不是目标不存在的提示。

对于新增和修改,这里是今天要重点关注的部分:新增,需要避免重复插入;修改,避免进行无效的重复修改;

幂等性的实现方式

实现方法:客户端做某一请求的时候带上识别参数标识,服务端对此标识进行识别,重复请求则重复返回第一次的结果即可。

举个栗子:比如添加请求的表单里,在打开添加表单页面的时候,就生成一个AddId标识,这个AddId跟着表单一起提交到后台接口。

后台接口根据这个AddId,服务端就可以进行缓存标记并进行过滤,缓存值可以是AddId作为缓存key,返回内容作为缓存Value,这样即使添加按钮被多次点下也可以识别出来。

这个AddId什么时候更新呢?只有在保存成功并且清空表单之后,才变更这个AddId标识,从而实现新数据的表单提交。

福利:这次面试稳了!看完50本面试总结后

转载:面试官:如何避免表单的重复提交?

参考资源链接:[Java并发编程:高并发接口幂等性解决方案解析](https://wenku.csdn.net/doc/4riqjkrwrr?utm_source=wenku_answer2doc_content) 确保接口幂等性是高并发环境下接口设计的关键一环,尤其是在处理支付、订单处理等业务时,防止因为网络重传或者系统故障导致操作被重复执行。针对这一问题,可以采用以下技术方案: 首先,我们可以利用唯一索引来保证数据的一致性。在并发场景下,尤其是在数据库操作中,可以通过在关键字段上设置唯一约束或唯一索引来防止插入重复数据。例如,在处理订单时,订单号可以设置为唯一索引,这样在并发环境下,尝试创建重复订单的操作会被数据库自动阻止,从而保证了幂等性。 其次,Token机制也可以有效地解决幂等性问题。具体实现方式是,在用户发起请求时,服务器生成一个唯一的Token并返回给用户。用户的后续请求必须携带这个Token,服务器端通过验证Token的有效性和唯一性来控制请求的执行。这种方式常用于防止表单重复提交。在高并发场景下,Token通常存储在分布式缓存如Redis中,以便在集群环境下也能保证Token的全局唯一性。 再者,可以使用幂等函数来设计接口幂等函数指的是无论执行多少次,结果都相同且副作用可预测的函数。在接口设计中,可以根据业务逻辑实现幂等函数,例如,对于支付接口,可以设计为如果支付状态为已支付,则重复支付请求应返回已支付状态,而不是再次执行支付操作。 最后,结合数据库事务也是确保幂等性的一种常见做法。在操作数据库时,可以利用事务的ACID特性(原子性、一致性、隔离性、持久性),通过事务控制来确保操作的幂等性。例如,在执行更新操作时,可以利用乐观锁机制,通过版本号或时间戳来判断数据是否被其他事务更新过,从而避免重复更新。 综上所述,通过结合唯一索引、Token机制、幂等函数以及数据库事务等技术,可以在Java并发环境下设计出既高效又保证幂等性接口。为了更深入地理解这些方案的实现细节和应用场景,建议参考资料《Java并发编程:高并发接口幂等性解决方案解析》。该资料详细探讨了如何在Java并发编程中处理高并发接口幂等性问题,不仅包含了理论知识,还提供了大量的实战案例和代码示例,非常适合想要在高并发编程领域深入研究的技术人员。 参考资源链接:[Java并发编程:高并发接口幂等性解决方案解析](https://wenku.csdn.net/doc/4riqjkrwrr?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值