使用Java(Streams)的生产者消费者多[线程/处理]

时间:2018-05-01 18:51:20

标签: java multithreading lambda aws-lambda java-stream

我正在开展一个基本上是生产者/消费者长链的项目。这意味着第一个进程从用户(巨大的csv文件)获取数据,逐行处理数据,传递到另一个消耗此数据的进程/线程,进程然后传递给另一个进程/等等。
该链条长约8-10个单位,每个单位充当消费者,然后是生产者 我曾想过使用AWS lambdas来做这件事。我也可以使用Java流。我在AWS lambda中看到的优势是您可以对每个节点设置单独的限制限制 因此,如果您的节点的工作是更新dynamodb记录,我们可以限制此节点以匹配dynamodb的写入单位等。
我看到使用lambda的另一个优点是我不必编写代码来管理多处理(或多线程),我的数据处理也不依赖于我选择的硬件 - 我还可以通过选择来节省成本一个低级硬件,其唯一的工作就是作为第一个制作人,但我还是要为aws lambda付费。

  1. 如果我使用Java lambda并且使用它们的方式与使用AWS lambda的方式相同,那么使用Java流是否相似?我可以在Java lambdas中使用限制吗?
  2. 如果我使用Java流,是否有一种简单的方法来管理多处理(线程)。
  3. 除了限制和管理池之外,使用lambda还有其他优点吗?有什么缺点吗?
  4. 除了以上两种之外还有其他选择吗?
  5. 如果我希望链中的某些节点有多个消费者,该怎么办?例如消费者使用数据,流程并将其传递给链中的下一个,但我们还必须记录数据或将其存储在db中。

2 个答案:

答案 0 :(得分:1)

看起来reactive streams(而不是java流或AWS lambdas)是适合您任务的最佳工具。他们提供:

  • 背压,即平衡消费者和生产者的速度
  • 并行执行管道链的所有步骤
  • 为同一个制作人连接多个消费者

有许多reactive streams实现:JavaRx2,Project Reactor(包含在Spring 5中),Akka Streams等。

答案 1 :(得分:0)

听起来你应该使用步骤函数将lambda链接在一起。