【问题标题】:Spring RESTful web services - High volume data processingSpring RESTful Web 服务 - 大容量数据处理
【发布时间】:2016-09-28 07:48:10
【问题描述】:

我正在尝试构建一个 Spring/Spring Boot-RESTful Web 服务,

  1. 它接受一个 CSV 文件,每行有 100 万行/40 列作为输入(来自基于 Angular 的前端),并且将是一个同步调用。在进入其他屏幕之前,必须通知用户上传状态。所以,等待时间不能超过几分钟(比如 5 分钟)。

  2. 这些行中的每一行都必须根据 DB 中的内容进行验证,如果发现有效,则将其插入 DB。简而言之,每一行都可以是一个单独的独立事务。

您能否建议实现这一点的最佳方法是什么?

当前的遗留系统在存储过程中实现了相同的功能,这使得解决方案与 DB 紧密耦合,如果需要更改 RDBMS,这将是一个问题。

  1. 在异步 Web 服务调用中处理这 100 万个数据块(比如 20k)的任何方法?

  2. 春季批次?

  3. 存储过程能否比上述两个选项更合适、性能更好(猜不出来!)?

您能否提供一些至少与存储过程一样好的方法以及如何根据建议的解决方案进行水平扩展。

【问题讨论】:

  • 您的 API 调用是否依赖于 API 响应?
  • 您可以实现spring批处理-使用块处理和主从配置来并行处理和批量更新它们(失败和成功记录不同)。或者将每条记录存储在一个临时表中,然后调用一个过程来批量插入它们。
  • 适当缩放网格大小,有一个很好的例子可以参考mkyong.com/spring-batch/spring-batch-partitioning-example

标签: spring rest spring-boot spring-batch


【解决方案1】:

您的三个建议选项走在了正确的轨道上。很遗憾,您的问题的答案是,这取决于

以上任何一种方法都适合您。我个人更喜欢 Spring Batch,因为我发现编程模型简单直观。

Spring Batch Processing Guide


另一种方法是使用Messaging 来并行处理行:

  1. 控制器收到包含大量数据的 CSV 文件
  2. 将数据拆分成更小的部分并发送到临时消息队列
  3. 多个工作节点接收消息并处理它们
  4. 监控临时队列的大小并相应地更新用户(完成百分比)

简而言之,您对自己领域的了解最终将引导您找到适合您业务的最佳解决方案。

【讨论】:

  • 不想考虑 MQ,因为它增加了另一个故障点(当 MQ 服务器出现问题/高负载时),而没有它也可以处理数百个行数据。如果在春季批次中需要做同样的事情,任何人都可以建议,我们如何跟踪哪个工人正在处理哪一行?如何避免多个工作人员处理相同的数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2013-01-14
  • 2015-02-22
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多