我正在开发一个C# mobile
应用程序,该应用程序需要与PHP
web服务器进行主要交互。但是,应用程序还需要支持"脱机模式",因为连接将通过cellular network
进行。该网络可以在随机时间丢弃请求。我在以前的"脱机模式"应用程序中遇到的问题是,当请求导致超时时,服务器可能已经处理了该请求,也可能尚未处理。如果多次发送请求会产生重复,这就是一个问题。我正经历着这个过程,并提出了以下想法。
- Mobile设置要与请求一起发送的头值,如
UniqueRequestID: 1
- 在接收到请求后,PHP服务器将
UniqueRequestID
添加到当前用户会话$_SESSION['RequestID'][] = $headers['UniqueRequestID'];
- 服务器实现一个GetRequestByID,如果当前会话存在
id
,则返回true;如果不存在,则返回false。或者,这可以返回请求的缓存结果
这似乎是一种查看请求是否成功联系服务器的可靠方法。在移动设备中,在重新连接到服务器时,我们会检查是否收到请求。如果是,请跳过那个挂起的offline message
,转到下一个。
问题我在这里重新发明轮子了吗?这种方法容易失败吗?有更好的方法/替代方案吗?
-我在这里向其他开发人员介绍了这一点,我们认为这似乎很简单,意味着这个"系统"可能已经存在于某个地方
-如果我的谷歌技能今天让我失望了,我深表歉意
正如您正确指出的,这个问题并不新鲜。在不同的层面上,已经有多次尝试来解决这个问题。
传输级别
HTTP传输协议本身不提供任何可靠的数据传输机制。原因之一是HTTP是无状态的,不太关心以前的请求和响应。IBM曾试图制造一种基于HTTP的可靠传输协议HTTPR,但它从未流行起来。你可以在这里阅读更多关于它的信息。
消息级别
大多数Web服务仍然使用HTTP作为传输协议,并在其之上使用SOAP消息传递协议。当应用程序级消息传递协议还必须保证一定程度的可靠性和安全性时,SOAP over HTTP是不够的。这就是引入WS-Reliability
和WS-ReliableMessaging
协议的原因。这些协议允许在存在软件组件、系统或网络故障的情况下在分布式应用程序之间可靠地传递SOAP消息。同时,它们提供了额外的安全性。你可以在这里和这里阅读更多关于这些协议的信息。
您的解决方案
如果您需要一种简单的方法来确保消息尚未被处理,我想您的方法并没有错。我建议使用数据库而不是会话来存储每个请求的处理结果。如果您使用$_SESSION['RequestID'][]
,如果会话丢失(用户离线特定时间、服务器重新启动或崩溃等),您将遇到麻烦。此外,如果您使用数据库而不是会话,那么稍后只需添加额外的web服务器就可以更容易地扩大规模。