高并发下的接口幂等性解决方案
1.token机制,防止页面重复提交
流程如下:
- 1.发送方记录token(GUID) (通常保存到redis)
- 2.发送提交接口 带上发送方token
- 3.将token从redis中删除token,如果成功删除说明第一次执行,如果删除失败即已经删除过,说明该消息已经被消费。
存在问题
这样的方式存在的问题主要还是性能消耗
因为从流程可以看到,发送方需要额外调用一次redis,接收方也需要额外调用一次redis 而且是每次都要调用。无论这条消息是不是重复的。
2.使用数据库唯一主键
这样的操作实际上是有特殊情况才能使用,比如最终数据是要落到DB上的。这样的情况可以使用GUID或者其他token方案,通过设置唯一键的方式将要落地的数据顺便做幂等验证。
优势
这样做相比redis方式的优势就是不需要额外操作,因为幂等的保证是顺便的。
存在问题
使用范围有限,并不是任何幂等操作一定会涉及数据库操作。另外也需要为业务增加唯一主键。
可选唯一ID生成方式
- UUID
- snowflake
。。。