我已经创建了一个Web应用程序,并且我添加了自己的API:
/api/v1.0/articles/new/{since}
此API返回自{since}
以来的新文章的JSON,其中{since}
是unix时间戳。
我想在网站上添加自动更新,并在用户访问网站时自动查询文章,但我不太清楚如何操作。
我正在考虑使用以下javascript(jQuery)来执行此操作:
setInterval(function () {
$.get('/api/v1.0/articles/new/{since}', function (data) {
/* parse data, add new articles to page */
/* since = now */
});
}, 30*1000)
这是正确的解决方案吗?我担心如果有500人访问我的网站,那么我每30秒会收到500个请求,这可能会导致我的服务器死机。
我可以尝试哪些其他可能的解决方案?当有新的东西时,服务器是否有办法将数据推送到webapp,而不是我拉动它并查询? (这被称为彗星ajax吗?)
答案 0 :(得分:1)
对500名用户进行30秒的轮询,平均每秒约17次请求。是否会破坏您的服务器取决于您在每个请求上执行的操作,您正在服务的其他请求,服务器运行的硬件等等。如果您对每个请求执行的操作都是对表的简单数据库查询 - 可以按时间戳索引 - 每秒17个请求非常轻。但是,在我看来,你真的应该实现某种形式的服务器推送 - 你所谓的"彗星ajax"。首先,如果您的任何API调用花费的时间超过30秒,您将在上一个API调用完成之前执行另一个API调用,这可能会导致"雪球"效果。
服务器推送的具体方式取决于服务器堆栈上的可用内容以及您希望客户端浏览器支持的内容。例如,如果您正在运行Node.js
,则可以使用socket.io
包使用 Web套接字进行服务器推送。但旧版浏览器不支持Web套接字,并且并非所有Web套接字的浏览器实现都相同,因此您可能需要考虑基于 AJAX长轮询或多部分文档的方法流。通常,您需要在服务器上安装一些代码或软件包以支持您使用的方法,尽管有一些解决方案可以透明地确定哪种方法最适合每个客户端连接。 (例如,SignalR
执行此操作,但这适用于Microsoft / .NET堆栈。)
您可能希望阅读以下文章作为起点,然后根据您的特定技术堆栈以及您需要支持哪些浏览器的假设,在此处发布更具针对性的问题。
http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery