假设以下场景:
- 客户端正在向服务器发送 HTTP POST
- 请求有效并且
已被服务器处理。数据已插入数据库。
- Web 应用程序正在响应客户端
- 客户端超时
并且看不到 HTTP 响应。
在这种情况下,我们会遇到以下情况:
- 客户不知道他的数据是否有效以及是否正确插入
- Web 服务器(rails 3.2 应用程序)不显示任何异常,无论它是否位于 apache 代理后面
我在 HTTP 文档中找不到如何处理这种情况。我的问题是:
a) 客户是否应该期望他的数据可能已经被处理? (然后尝试例如 GET 请求来检查数据是否已提交)
b) 如果不是 (a) - 服务器应该检测到它吗?有可能在 Rails 中做到这一点吗?在这种情况下,可以撤销更改。在这种情况下,我期望 Rails 应用程序有某种期望,但没有......
HTTP是无状态协议 http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol:根据定义,这意味着您无法在客户端知道 http 动词POST
是否成功。
Web 应用程序使用一些技术来克服此 HTTP“功能”。他们包括。
- 服务器端会话 http://en.wikipedia.org/wiki/Session_(computer_science)
- cookies http://en.wikipedia.org/wiki/HTTP_cookie
- 表单中的隐藏变量
However,这些都不能真正帮助解决您的问题。当我过去遇到这些类型的问题时,他们是几乎总是结果服务器处理 Web 请求的时间过长 https://stackoverflow.com/q/26298674/1184492.
有一句话非常好,我在不眠之夜对自己低语:
“网络请求是一个可怕的地方,你想要尽快进入和退出
尽你所能”——里克·布兰森
您希望在 100 - 500 毫秒内进入和退出网络请求。您满足了这些数字,您将拥有一个表现良好/与 Web 服务器配合良好的 Web 应用程序。
为此我建议您调查一下您的帖子花费了多长时间,并找出如何缩短这些请求。如果您在执行 dbms 插入之前在服务器端进行一些认真的处理,那么您应该考虑将这些处理交给某种任务/排队系统。
“认真处理”的一个例子可以是某种图像上传,可能在上传后进行一些图像处理。
任务分配和排队解决方案的一个示例是:RabbitMQ http://www.rabbitmq.com/ and Celery http://www.celeryproject.org/
您的问题的解决方案示例可能是:
- 将数据的一部分插入到 dbms 中(或者甚至更快一些)NoSQL http://en.wikipedia.org/wiki/NoSQL解决方案 )
- 将昂贵的处理工作交给后台任务。
- 返回到用户/网络客户端。 (即使在后台任务仍在运行)
- 用 (轮询、流式传输或网络套接字 https://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet/12855533#12855533)这一步并非易事,但最终的结果是值得付出努力的。
收紧这些网络请求,您的客户很少会收到回复。
在客户没有收到数据的那一天:你如何防止多个帖子...我对你的数据一无所知。但是,您可以执行一些与架构相关的操作来唯一标识您的帖子。即在服务器端计算出数据是否是update
or a create
.
这个答案 https://stackoverflow.com/a/26303084/1184492涵盖了一些您可以使用的轮询/流/websockets 技术。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)