因此,当我们注意到我们的网站上存在重复订单的情况时,问题就开始了。当我们开始调查时,我们无法缩小页面上可能导致重复订单的范围,但无法解释重复数据的状态。最奇怪的部分是这些订单是在同一时刻(低至最小毫秒)创建的。在服务器的访问日志中,请求也是在同一时刻收到的。
因此,为了进一步调查,我们打电话给随机客户,他们中的大多数人的答案几乎相同,他们使用慢速连接(其中一些通过调制解调器)并且他们使用 chrome。大多数反馈是,页面卡住了,所以我按下了返回按钮。经过一番搜索,我们了解到 chrome 中的 Http 流水线功能,这是一种在连接缓慢时获取页面的激进技术。
所以这是交易,用户按下提交按钮 --> 验证 ajax JSON 调用 (GET) --> 表单数据通过 ajax JSON 调用发布 --> 向客户返回一些反馈,客户采取行动,然后被适当地重定向.
我不确定这是否是 AJAX 甚至 GET/POST 调用的最佳用途,但这就是我所坚持的。
由于这个问题发生在非常具体的情况下(慢速连接和 chrome 必须触发重复连接)并且说实话,我无法复制这个。然而,由于近 95% 的反馈指向 Chrome,我不得不考虑 http 流水线。这是唯一可能触发请求的解释,以便同时创建多个记录。
我还了解到,http 流水线仅适用于 GET 请求而不是 POST 请求。所以我不确定是否:
这涵盖了 AJAX POST 请求(我使用 jQuery,我确实使用 type:POST)Chrome 可能会以某种方式返回(错误地)为所有请求抛出多个请求(请参阅:如何处理 chrome 发送额外请求?)
在 Chrome 的情况下,我能找到的唯一论点是默认情况下禁用了 http 管道。
我什至不确定在这种情况下要进行哪些检查,因为这两个请求都是同时处理的。我可以在后端检查是否创建了类似的记录,但这将是一个昂贵的检查,减慢订购速度,企业可能不欢迎它。
我在http://www.chromium.org/developers/design-documents/network-stack/http-pipelining找到了一些东西,但不确定我是否必须强制/破解我的请求才能满足停止 http 流水线的标准之一。
任何对此进行测试的点将不胜感激。