【问题标题】:REST calls slowing down Spring boot application - performance improvement neededREST 调用减慢 Spring Boot 应用程序 - 需要提高性能
【发布时间】:2017-06-22 23:13:53
【问题描述】:

我们有一个应用程序,我们在其中解析 excel(大约 100k),对于 excel 中的每一行,我们将调用 4 个不同的 REST 调用 [in different domain],并且返回的输出存储在 REDIS 实例中以供进一步处理

1) 如果有 100k 条记录,我们会进行 100k *4 REST API 并行调用(并行 50 个线程),一条记录需要 30 秒才能完成整个过程。这似乎减慢了我们的进程,因此是否有任何其他替代框架(在 java 相关技术中会有所帮助)我们可以用来加速这个进程。

2) 由于 REDIS 是单线程,我们按顺序插入数据,因此在该过程中需要更多时间,有没有办法从 REDIS 并行放置和获取数据,或者还有其他替代方法。

【问题讨论】:

    标签: java spring multithreading performance rest


    【解决方案1】:

    这真的很有趣,我脑海中浮现的一个解决方案就是。

    • 使用队列(例如 Apache ActiveQ)
    • 处理 excel 文件并将单个消息放入队列
    • 编写其他服务来处理来自该队列的消息。

    通过这样做,您的主要服务将很轻松,它只会读取 excel 文件并将消息放入队列,可以在放入队列之前使用标头来区分消息,如果您打算为不同类型编写不同的服务,这将有所帮助他们将从队列中消费的消息。

    【讨论】:

      【解决方案2】:

      您可以使用@Async (https://spring.io/guides/gs/async-method/) 也可以使用执行器同时执行多个进程。以下是我对执行者的处理方式:

      ExecutorService executor = Executors.newFixedThreadPool(nThreads);
      List<FutureTask<Integer>> workersList = new ArrayList<FutureTask<Integer>>();
      

      然后将你的新线程提交给执行器:

      for (int i = 0; i < nRecords; i++) {
        Worker worker = new Worker(args);
            workersList.add(worker);
             }
      pool.shutdown(); // Disable new tasks from being submitted 
      while (!executor.isTerminated()) {
                      }
      for (int i = 0; i < nRecords; i++) {
               System.out.println(workersList.get(i).get());
           }
      

      您的工作线程应该实现可调用:

      public class Worker implements Callable<Integer> (String[] args)
      

      【讨论】:

        猜你喜欢
        • 2021-04-23
        • 2016-10-06
        • 2017-01-11
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多