弱网环境测试与重复提交问题总结

网络 网络优化 网络运维
我们的做的那款App有个签到功能,该功能的基本逻辑是:用户当天签到时会先去数据库查询一下是否已经签到过,如果没有则插入数据作为当天的签到记录。有段时间经常发现会有重复签到的问题,某些用户几乎同一个时间点会有多次签到记录,后来经过排查发现在弱网环境会出现这种情况,详情如下。

一、弱网环境测试

所谓弱网环境简单来说就是网络质量较差导致丢包和延迟等现象,具体现象就是app响应很慢。测试工具用的是强大的fillder(没用过的自行google),fiddler是通过延迟发送或接收数据的时间来模拟限速,设置方法是:Rules → Performances → Simulate Modem Speeds,然后按Ctrl+r快捷键会自动打开一个CustomRules.js文件,里面有各种自定义的规则。其中有这么一段:

if (m_SimulateModem) {
oSession["request-trickle-delay"] = "300";
oSession["response-trickle-delay"] = "150";
}

意思是每延迟300ms发送1kb的数据,每延迟150ms下行1kb的数据,具体值可以修改,自定义限速。定义完数据保存之后,已经勾选的SimulateModem Speeds会被取消,按照上面的步骤再次将其勾选即可。

再说下通过fillder来调试手机app运行所需要的基本设置:

设置手机代理IP和端口

找到手机的设置–>WLAN–>已连接的WiFi,长按,弹出修改网络的选项,点击进入,在“显示高级选项”前打钩,将电脑的IP和端口设置进去,端口一般选的是8080,但是可能会出现此端口被占用的情况,选择其他端口也可以。

2.设置filler,如下图

 弱网环境测试与重复提交问题总结

3.打开app点击签到功能,发现签到响应缓慢,可重复点击,这就造成了几乎同一时间,同一个用户有多个签到请求发送到服务器,这几个请求检查是否已经签到时发现当天记录为空(还都没有来得及写进到数据库),这样在高并发的情况下就会有多条记录同时写入签到记录表。

二、并发重复提交解决方案

弱网环境所引发的这个并发重复提交问题,在服务器端有一个比较简单的解决方案:利用mysql***索引机制的验证,当有重复数据写入时就会被拒绝,保证数据的***性。

另外一种方案是利用redis计数器特性,由于redis是单线程原子性操作,不存在多线程并发的问题,将userId和年月日作为key,每次签到请求进来加1,如果得到的值等于1,说明这是当天***次签到,写入数据库,如果大于1,则直接返回“已签到”信息提醒用户即可。

责任编辑:何妍 来源: CSDN博客
相关推荐

2016-06-28 11:28:11

2020-06-22 14:18:02

运维架构技术

2024-03-27 07:55:58

SpringRedis海量

2022-11-11 07:34:43

2022-09-15 17:37:40

网络传输链路数据包数据拥塞

2024-11-05 09:56:30

2009-11-17 11:30:31

PHP表单

2009-06-05 10:37:52

struts2 国际化表单

2013-11-13 11:01:14

表单表单重复提交表单策略

2022-11-17 07:43:13

2022-11-15 07:39:48

2018-03-21 14:23:39

vagrant测试环境

2018-03-28 15:07:16

测试环境vagrant

2023-08-24 08:02:19

幂等性API请求

2013-11-13 14:39:53

表单提交开发

2024-07-26 07:59:25

2016-01-07 10:47:06

TCP网络协议广域网

2009-09-23 17:52:16

Hibernate概念Hibernate常见

2022-09-13 13:49:05

数据库隔离

2009-09-21 17:59:13

Spring REST
点赞
收藏

51CTO技术栈公众号