具有Java(流)多线程/处理的生产者-消费者
我正在从事一个项目,它本质上是一个生产者/消费者的长链。这意味着第一个进程从用户(巨大的csv文件)获取数据,逐行处理数据,传递到另一个进程/线程,该进程/线程使用该数据,处理数据,然后传递到另一个进程/线程,以此类推。具有Java(流)多线程/处理的生产者-消费者,java,multithreading,lambda,aws-lambda,java-stream,Java,Multithreading,Lambda,Aws Lambda,Java Stream,我正在从事一个项目,它本质上是一个生产者/消费者的长链。这意味着第一个进程从用户(巨大的csv文件)获取数据,逐行处理数据,传递到另一个进程/线程,该进程/线程使用该数据,处理数据,然后传递到另一个进程/线程,以此类推。 链长约8-10个单元,每个单元分别充当消费者和生产者。 我曾想过使用AWS lambdas来实现这一点。我也可以使用Java流。我在AWS lambda中看到的优点是,您可以在每个节点上设置单独的节流限制。 因此,如果您的节点的任务是更新dynamodb记录,那么我们可以限制此
链长约8-10个单元,每个单元分别充当消费者和生产者。
我曾想过使用AWS lambdas来实现这一点。我也可以使用Java流。我在AWS lambda中看到的优点是,您可以在每个节点上设置单独的节流限制。
因此,如果您的节点的任务是更新dynamodb记录,那么我们可以限制此节点以与dynamodb的写入单元相匹配,依此类推。
使用lambda的另一个优点是,我不必编写代码来管理多处理(或多线程),我的数据处理也不会依赖于我选择的硬件——我还可以通过选择一个低级硬件来节省成本,该硬件的唯一工作是充当第一生产商,但我仍然需要支付aws lambda的费用
听起来您应该使用步骤函数来链接lambda。听起来您应该使用步骤函数来链接lambda。看起来反应流(而不是java流或AWS lambda)是最适合您的任务的工具。它们提供:
- 背压,即平衡消费者和生产者的速度
- 并行执行管道链的所有步骤
- 为同一生产商连接多个消费者
有许多
反应流
实现:JavaRx2、Project Reactor(包含在Spring 5中)、Akka streams和其他。看起来反应流
(而不是java streams或AWS lambdas)是最适合您的任务的工具。它们提供:
- 背压,即平衡消费者和生产者的速度
- 并行执行管道链的所有步骤
- 为同一生产商连接多个消费者
反应流
实现:JavaRx2、projectreactor(包含在spring5中)、Akka流和其他