【问题标题】:How to query my own web api from my own webapp?如何从我自己的 webapp 查询我自己的 web api?
【发布时间】:2014-10-01 19:13:00
【问题描述】:

我创建了一个 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吗?)

【问题讨论】:

  • 构建读取api的缓存。发送用户(全部 500 个)读取 1 个缓存文件。

标签: jquery ajax web comet polling


【解决方案1】:

对 500 个用户进行 30 秒的轮询,您平均每秒将处理大约 17 个请求。这是否会杀死您的服务器取决于您对每个请求执行的操作、您正在服务的其他请求、您的服务器正在运行的硬件等。如果您对每个请求所做的只是针对表的简单数据库查询-- 大概按时间戳索引 -- 每秒 17 个请求是相当轻的。然而,在我看来,你真的应该实现某种形式的服务器推送——你称之为“comet ajax”。一方面,如果您的任何 API 调用花费的时间超过 30 秒,您将在前一个 API 调用完成之前执行另一个 API 调用,这可能会导致“滚雪球”效应。

您执行服务器推送的具体方式取决于您的服务器堆栈上可用的内容,以及您希望客户端浏览器支持的内容。例如,如果您正在运行Node.js,您可以使用socket.io 包通过web 套接字 进行服务器推送。但是老的浏览器不支持 web sockets,而且不是所有的 web sockets 浏览器实现都是一样的,所以你可能需要考虑基于AJAX long-polling,或者multi-part document的方法流媒体。通常,您需要在服务器上安装一些代码或包以支持您使用的方法,尽管有一些解决方案可以透明地确定哪种方法最适合每个客户端连接。 (例如,SignalR 这样做,但那是针对 Microsoft / .NET 堆栈的。)

您可能希望阅读以下文章作为起点,然后根据您的特定技术堆栈和您对需要支持哪些浏览器的假设在此处发布更有针对性的问题。

http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2017-07-06
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多