我们有一个创建订单的应用程序,并通过HTTP post发送到服务器。
我被问到在第3步中,响应未能到达客户端并在途中迷路。然后客户端将尝试重新发送相同的订单。这将引入重复的订单问题。以及如何解决这个问题。
我想到了客户端生成一个唯一ID并发送到服务器的想法,所以当客户端第二次发送它时,服务器可以知道它是一个重复的订单,并且只返回前一个响应。
但我很快就记得HTTP建立在TCP之上,它应该有一个三向握手的东西用于数据连接。这意味着:
从客户端的角度来看,如果客户端没有从服务器收到任何响应,那么连接将一直保持到超时,然后会抛出异常让客户知道。
我的问题是:
从服务器的角度来看,在发送响应后,如何确定响应已到达客户端?
在传输层应该有一个三向握手连接终止,以确保只有在客户端收到消息后才能关闭连接,对吧?因此,如果消息在途中丢失,服务器应该触发异常,我是对的吗?
如果是这种情况,可以通过确保服务器仅在步骤3中没有异常时执行步骤4来解决问题?如果我的整个上述想法是错误的,还有其他任何解决方案吗?
由于
答案 0 :(得分:0)
整个想法都错了。你需要查找 idempotence 。基本上每个交易都需要是幂等的,这意味着将其应用两次或更多次并不比应用一次更有效。这通常通过唯一的事务序列号来实现,这些事务序列号在事务完成时记录在服务器上。