【问题标题】:Handling multiple requests efficiently in a REST api在 REST api 中有效地处理多个请求
【发布时间】:2016-12-10 17:23:37
【问题描述】:

我使用 Spring Boot 构建了一个 REST api,它基本上通过 POST 接受两个图像并对它们执行图像比较。 api 是同步调用的。我没有使用外部应用程序服务器来托管服务,而是将其打包为 jar 并运行它。

@RequestMapping(method = RequestMethod.POST, value = "/arraytest")

    public String compareTest(@RequestParam("query") MultipartFile queryFile,@RequestParam("test") MultipartFile testFile,RedirectAttributes redirectAttributes,Model model) throws IOException{
        CoreDriver driver=new CoreDriver();
        boolean imageResult=driver.initProcess(queryFile,testFile);
        model.addAttribute("result",imageResult);
        return "resultpage";

    }

服务可以在多台机器上并行调用,我需要我的服务高效执行。我试图了解如何处理对 REST 服务的并行调用? 当请求发送到服务时,是否会创建服务的单个对象,并在多个线程中使用同一个对象来处理多个请求?

一个后续问题是是否有可能从处理请求的角度来提高服务的性能,而不是提高服务功能的性能。

【问题讨论】:

    标签: java spring multithreading rest spring-boot


    【解决方案1】:

    Spring 控制器(和大多数 Spring bean)是单例的,即您的应用程序中有一个实例,它处理所有请求。

    假设这不是 Web 套接字(如果您不知道这意味着什么,可能不是),servlet 容器通常会维护一个线程池,并且会从池中获取当前未使用的线程并使用它来处理请求。

    您可以通过例如更改线程池的某些方面(初始线程、最大线程等)来调整它。这是 servlet 容器的东西(即配置 tomcat/jetty/你正在使用的任何东西)本身不是 spring。

    您还可以调整其他 http 方面,例如压缩。这通常可以通过容器来完成,但如果我没记错的话,spring 提供了一个 servlet 过滤器可以做到这一点。

    您执行的图像库和图像操作也很重要。许多库将图像转换为内存中的原始图像以执行操作。这意味着 3 兆 jpg 可以占用 100 兆以上的堆空间。这意味着您可能需要某种semaphore 来限制并发图像处理。

    最好的方法是尝试不同的库,看看哪些最适合您的用例。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      控制器将是单例的,但有一些方法可以使处理异步。就像线程池或 JMS。你也可以有多个节点。这样,只要您返回一个密钥并有一个服务供客户端轮询以获取稍后的结果,您就可以横向扩展后端处理。

      此外,您还可以集群您的应用程序,以便处理更多节点。如果可能的话,缓存结果;如果您获得相同的输入并且它们对于 30% 或更多的请求具有相同的输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-29
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 2012-10-30
        • 1970-01-01
        相关资源
        最近更新 更多