服务器返回JSON,网页有时无法接收到

软件和网站开发以及相关技术探讨
回复
alober
帖子: 135
注册时间: 2010-07-13 17:04

服务器返回JSON,网页有时无法接收到

#1

帖子 alober » 2015-06-26 10:14

服务器返回 JSON,如下例,后面那个数字 9 表示的是页码,从 1 到 10000 都是存在数据的
curl -i http://localhost/data/9
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 220

[{"id":11,"version":0,"name":"my data"}]

用 curl 每次都能获取到这些数据,在浏览器(ubuntu 15.04默认源里最新版 firefox 和 chromium)里如果加上 console.log(data),这些数据也是每次都能取到
如果在浏览器里直接访问 http://localhost/data/9 这个 url,当改变页码时,有时能取到数据,有时就停留在加载中的状态,无法取到数据。
列举一下操作过程:
访问1:直接用浏览器访问 url,第 2 页取不到数据,只是加载中的状态
访问2:当清除缓存时再次访问,又取得到第 2 页的数据了
访问3:访问第 3 页,可以取到数据
访问4:再次用浏览器访问第 2 页,又是加载中的状态
访问5:用 curl 访问第 2 页,显示可以取到数据
服务器日志里显示根本就没有访问 4 的日志

如果修改页面的 js 代码,加上 console.log(data),重复上面的访问 1 到 5,都是能取到数据的。

请教这个现象可能是哪里出了问题?
phoenix341
帖子: 14
注册时间: 2015-06-11 14:47
系统: Ubuntu14.04

Re: 服务器返回JSON,网页有时无法接收到

#2

帖子 phoenix341 » 2015-06-27 14:56

缺少抓包分析,应该在服务器端和客户端同时抓包,验证你的访问1和访问4两次是否有发送请求.

console.log只是显示浏览器的处理过程,浏览器是否有发送请求需要更进一步的验证.

我估计抓包是抓不到访问1和访问4的请求包的.所以关键在于你的页面代码.最好把页面发送请求这一段代码发上来,看看你的console.log(data)到请求提交之间是否还要可能出现异常的地方.
alober
帖子: 135
注册时间: 2010-07-13 17:04

Re: 服务器返回JSON,网页有时无法接收到

#3

帖子 alober » 2015-06-28 7:22

谢谢关注。其实主楼的描述也是错的,如果把 curl -i 放进循环里,同样会卡在某个随机行而得不到数据。
在 chrome 里显示的是请求处于 pending 状态,服务器已经收到了这个请求,服务器日志里有这次请求的页码。但浏览器里没有收到数据,是直接返回 json 到网页,已经略去所有其它代码了。
如图,(_id 的规则是页码数加 1),服务器日志里已经打印了 114,就是被卡住的那个页码的请求,在网页里应该显示的 _id 是 115,但目前显示的是上次第 112 页的请求返回的 113。
2015.gif
alober
帖子: 135
注册时间: 2010-07-13 17:04

Re: 服务器返回JSON,网页有时无法接收到

#4

帖子 alober » 2015-06-28 19:11

用了 wireshark,但我不懂这些,看着像是图中那些红色的有问题。
图中有三条浅绿色的,前两个是正常的,就是访问 /article/1 时能正确返回,第三个是浏览器地址栏里请求了 /article/4,但无法看到返回结果的。
再描述一下我的环境:virtualbox 4.3.28 中安装的 xubuntu 15.04,后来又安装了 fedora 22,仍然是同样的问题,两个系统都是 64 位的,用作 web 的服务器是 java 的,jdk 用的是 openjdk version "1.8.0_45-internal"。
但我将服务端换到 windows 7 时却是正常的。
请求大家指点一下可能的问题,以及如何修复。
2015-06.png
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 服务器返回JSON,网页有时无法接收到

#5

帖子 oneleaf » 2015-06-28 20:11

服务器的并发数不够吧,由于客户端采用了 Keep-Alive 维持长连接,导致服务端的并发全部占满了。可以禁止客户端的Keep-Alive,或服务端的并发数增加。
alober
帖子: 135
注册时间: 2010-07-13 17:04

Re: 服务器返回JSON,网页有时无法接收到

#6

帖子 alober » 2015-06-28 22:44

ulimit 设置过了。Keep-Alive 在浏览器和服务器端都关掉了,仍然是同样的现象,如下图。
在服务器端可以看到 /article/4 这个请求的数据,mongodb 查询时也返回了数据,在服务器日志里都看得到,最后只是用了 response 写出一下。
2015-06.png
头像
oneleaf
论坛管理员
帖子: 10441
注册时间: 2005-03-27 0:06
系统: Ubuntu 12.04

Re: 服务器返回JSON,网页有时无法接收到

#7

帖子 oneleaf » 2015-06-29 14:55

和 ulimit 无关,你服务端是用什么写的?包括整个架构使用什么软件搭建的?用ab做个压力测试试试。
alober
帖子: 135
注册时间: 2010-07-13 17:04

Re: 服务器返回JSON,网页有时无法接收到

#8

帖子 alober » 2015-06-29 15:19

我觉得应该不是并发之类的,因为只用了浏览器一个一个地输入 url,就一个客户端请求而已,中间也等了很长时间才输入第二个 url。
服务器只是普通的 servlet。
现在我怀疑是 virtualbox 的问题,我在实体机里测试就没有这些问题出现,实体机目前在用 windows 7,稍后准备找台 ubuntu 试试。而在 virtualbox 里不管是 xubuntu 还是 fedora,都是同样的现象。不过这个怀疑没什么根据,以前都是在 virtualbox 里部署的,也没出过问题。
回复