如何防止客户端REST API调用阻止/使用Jersey优先处理某些API调用

一个雷尼日

我目前正在开发一个应用程序,该应用程序将从api中获取信息并进行分析并将其存储在后端的mongodb中。我使用java servlet作为服务器,使用jersey作为客户端调用api。我遇到一个问题,如果有人告诉我的servlet告诉泽西客户端快速连续多次调用api,则该网站将被冻结,因为仅一次查询就将花费约20秒的时间。现在,一次自发地执行5个查询,完成所有操作大约需要100秒。

注意:我没有使用从api中获取的所有数据,而是立即将其提供给用户。我只给1个呼叫提供用户数据,而其他300个呼叫则将他们的所有数据放入我的数据库。

tl; dr:用户单击按钮->球衣进行400个api调用->球衣从1个调用中向用户提供数据,然后在20秒内回处理其他399个(耗时20秒)->,其他人则单击按钮->直到前一个用户的399个呼叫完成后,他才会从该1个呼叫中获取数据。

我能否以某种方式使399调用在后台运行,以便第二个用户的第一个api调用(可以让他们看些东西)可以继续执行并在399之前执行?异步会工作吗?

这是我对jersey api调用的代码:构造函数:

public APICaller(){
    client = Client.create();
    sync = RateLimiter.getInstance();
}

调用函数:

public String call(String url){
    try {
        WebResource webResource = client
           .resource(url);

        ClientResponse response = webResource.accept("application/json")
                   .get(ClientResponse.class);

        if (response.getStatus() != 200) {
           /*throw new RuntimeException("Failed : HTTP error code : "
            + response.getStatus() + " header : " + response.getHeaders());*/
            System.out.println("Failed : HTTP error code : "
            + response.getStatus() + " header : " + response.getHeaders());
            if(response.getStatus() == 404)
                return "404";
            if(response.getStatus() == 429)
                return "429";
            if(response.getStatus() == 503)
                return "503";
        }

        String output = response.getEntity(String.class);

        return output;

      } catch (Exception e) {
        e.printStackTrace();
      }
    return null;
}

PS:对不起,如果我的代码看上去很恐怖,但我仍在学习如何使用Jersey。请让我知道是否应该以任何方式改进代码。谢谢。

丹尼尔

您可以实现一个队列系统,该队列系统将每个请求按顺序排列,然后在完成时将其弹出。如果优先级较高,则可以在中间处理时将项目添加到最前面。

所以

排队(先进先出)[]:

通话1:[1a,1b,1c,1d]

流行音乐:1a ... 1b ...

通话2:[1c,1d] <---按钮在第一个通话中单击了颠簸

变成

[ 2a,1c,1d,2b,2c,2d]

流行音乐:2a ... 1c ... 1d ... ... 2d

您可以通过将第一个调用放入数组本身来获得第一个调用,因此call1 [1a,1b,1c,1d]和call2 [2a,2b,2c,3d]然后调用1 [1] => 1a

我不知道如何在Java中执行此操作,但是在JS中,我必须检查每个方法的响应何时完成,因为它完成了调用,以检查队列中是否有任何内容可以对其进行迭代。也许while循环可以做到这一点。这将允许循环继续进行,直到所有后续调用完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Google Cloud客户端库进行基于API密钥的REST调用

如何使用Websocket客户端监听Rest API

如何使用Jersey客户端API在RESTful调用上添加标题

如何向客户端公开 REST api 微服务?

如何通过jersey rest客户端发布列表

如何使用Postman客户端调用Twitter API

如何使用jersey 2.19 REST API管理客户端/服务器会话数据

Twitter Finagle客户端:如何进行外部REST api调用?

在客户端C#上调用rest api

如何使用JIRA的REST客户端库?

使用Jersey运行Rest客户端

如何使用客户端 ID 和客户端密钥在 C# .NET Framework 中使用 SharePoint Rest API?

Java REST API客户端

如何对调用Jersey客户端API的代码进行单元化?

如何从Jersey API客户端调用中跟踪整个GET请求

从浏览器/ REST客户端调用时如何自动预订REST端点?

在客户端处理 REST 异常

Spring Rest客户端异常处理

我如何将凭证从Rest客户端发布到Spring Security Rest API?

如何在没有REST客户端的情况下演示REST API

如何限制客户端调用方法?

如何从python调用snowsql客户端

401错误-使用AZURE Active Directory(JavaScript客户端)保护调用REST API

使用GuzzleHttp REST API客户端的PHP中的非阻塞调用

使用Java客户端传递json对象来调用Rest API

如何在Advanced REST API客户端中使用Chrome中的Cookie

如何使用swagger从wp rest api生成Retrofit客户端库

如何使用rest api从keycloak客户端注册中获取初始访问令牌?

在客户端使用Adobe AIR时如何保护REST API