5

我需要建立一个可以处理 100 个查询/秒的网络规模的公共站点。我想使用 Ajax 使其具有交互性。Ajax 必须在所有主流浏览器和所有合理情况下(停止、从客户端重新启动页面;离开终端一整夜后第二天回来等)都是防弹的。服务器将是一个分布式 Linux 农场。

Jquery $.post() 似乎可以满足要求。

在过去,Ajax 是通过巧妙的方案实现的,以保持服务器和客户端之间的套接字打开。然后,此方法支持“Ajax Push”,也称为“HTTP Server Push”或“Comet”,这是一种允许服务器向客户端发起数据包的双向通信管道。

我看到的这种 Ajax 方法的主要问题是,它显然会在服务器上无限期地占用一个套接字。这似乎无法扩展。次要问题是一夜之间断开调制解调器连接会破坏管道。从保存的本地版本重新加载页面可能不会重新建立实时管道;并且各种浏览器需要各种不可靠的 hack 才能让 Ajax 首先工作。

使用基于发布请求的 Ajax 严格的“客户端拉动”模型似乎可以解决所有这些缺点。如果我能获得一个防弹的实现基础,我很乐意放弃未经请求的服务器推送的能力。

所以我使用了一个简单的 调用,至少对于 Firefox 和 Safari 来说它似乎工作得很好。
$.post( 'serverAjaxModule.php' ,
{mydata: Dataword },
function(output){ do_handle_results( output); });

但是,我不知道这是在做什么。我了解到 .post 是 .ajax 的宏,并且似乎有一些命令,例如 .ajaxSetup 和 .ajaxStart,它们的名称似乎使它们成为要求。然后是jquery-ui.min.js包含,它几乎可以运行任何设置。

那么我的问题:

  1. jquery $.post 是否可以很好地扩展到大量使用?

  2. $.post 是使用旧的连续打开套接字范例实现的,还是每次我执行客户端拉取 ajax 消息时都会建立一个新的套接字连接?影响?

  3. 我是否认为我不需要调用任何额外的东西,例如 .ajaxSetup 或 .ajaxStart 等,我可以继续成功调用 $.post 而不会产生任何异常后果?

  4. 这个特性的 jquery 跨浏览器功能有多好?我可以依靠它简单地为基本上所有合理的现代浏览器工作,还是有一些我必须注意的已知浏览器?

  5. 这种 Ajax 技术方法适用于古代浏览器有多远?.post 似乎正在使用往返 POST 技术,它应该是完全通用且防弹的;但我似乎记得一些旧技术的案例,有些浏览器太旧而无法支持 Ajax,我们不得不费力地围绕它编写代码。那些日子已经一去不复返了,现在,有了新的 jquery?在文明的国际世界中,我有多少需要担心非 Ajax 支持?

  6. 还有什么要注意的吗?如果您刚刚开始构建一个可大规模扩展的实现,您希望有人告诉您有关创建动态、交互式 Web 体验的最重要的几点是什么?

非常感谢您的友好帮助。

4

2 回答 2

3

$.ajaxSetup不是必需的,但它很有用:

  • 如果你运行 a$.post你不能定义一个错误处理函数并且调试会很困难 - 在这种情况下你可以定义一个通用的错误函数$.ajaxSetup;
  • 如果您运行 a$.post并接收需要显示的 HTML 数据,并且您需要它的元素将事件绑定到它们 - 您将能够定义应将哪些事件处理程序重新应用于这些新对象;

$.ajaxStart也不需要。

jQuery UI 是一个用户界面核心库,通常包含一些其他库,例如拖放元素行为、可排序元素行为和一些小部件,如手风琴菜单、模式消息框等。除非您打算实际使用它,否则不需要用于构建前端的 API。

1 它没有建设性的理由(据我所知)不扩展;当然,如果您将其设置为每毫秒向服务器发送请求,您可以使服务器崩溃(有许多并发用户)或使浏览器崩溃(打开无限循环的连接)或两者兼而有之,但无论哪种情况都不好工艺

2 不是它不保持打开的套接字

3 是

4 它适用于包括 IE6 在内的任何浏览器 - 但某些浏览器(例如 IE6)可能会由于大量 JavaScript 代码(及其内存泄漏)而出现更大的减速

5 IE6

6

  • 浏览器长时间打开会像花生酱一样消耗内存;
  • JSON 是您的朋友 - 构建您的应用程序时要考虑前端逻辑,不要使用通过网络发送的 HTML 来构建它,这会使事情变得复杂(您需要将事件处理程序重新绑定到通过 AJAX 接收的每个新对象,您几乎没有格式化访问权限到您刚刚收到的 HTML 的大型博客等);
  • 以 JSON 格式获取数据,使用 Mustache.js 等前端模板引擎使用 JSON 组合数据;

内存泄漏和/或加载和未使用的内容通常在刷新后被清除——尤其是在 Chrome 中——另一方面,Firefox 是一个真正的内存吞噬者,即使没有任何活动也可以打开 6-12 小时,你会看到增加内存使用情况。

于 2012-08-10T07:10:54.270 回答
0

如果不是浏览器考古学方面的专家,我认为您对 Comet 作为不支持正确 Ajax 的旧浏览器的解决方法的回忆是错误的。Comet 是一个奇特的特例,你说得对,它的扩展性通常很差。但是,我不会担心今天仍在使用的浏览器中的 Ajax 支持,它应该是一个已解决的问题。

于 2012-08-10T07:32:59.900 回答