Производитель-потребитель с Java (Streams) Multi [Threading / Processing]

Я работаю над проектом с длинной цепочкой производитель / потребитель. Это означает, что 1-й процесс принимает данные от пользователя (огромный файл csv), обрабатывает данные построчно, переходит к другому процессу / потоку, который потребляет эти данные, обрабатывает, а затем переходит к другому и так далее. Цепочка составляет около 8-10 единиц, каждая из которых выступает в роли потребителя, а затем производителя. Я подумал об использовании лямбда-выражений AWS для этого. Я также мог использовать потоки Java. Преимущество, которое я вижу в лямбда-выражении AWS, заключается в том, что вы можете установить индивидуальный лимит регулирования для каждого узла. Итак, если задача вашего узла заключается в обновлении записи Dynamodb, мы могли бы регулировать этот узел, чтобы он соответствовал блокам записи Dynamodb и так далее. Еще одно преимущество, которое я вижу при использовании лямбда, заключается в том, что мне не нужно писать код для управления многопроцессорностью (или многопоточностью), и моя обработка данных не будет зависеть от выбранного мной оборудования - я также мог бы сэкономить, выбрав низкокачественное оборудование, единственной задачей которого будет выступать в качестве первого производителя, но я все равно буду платить за aws lambda.

  1. Работает ли с потоками Java аналогично, если я использую лямбда-выражения Java и использую их так же, как я бы использовал лямбда-выражения AWS? Могу ли я использовать регулирование в лямбдах Java?
  2. Если я использую потоки Java, есть ли простой способ управлять многопроцессорностью (потоковой передачей).
  3. Есть ли какие-либо другие преимущества использования лямбда-выражения помимо регулирования и управления пулами? Есть ли недостатки?
  4. Есть ли другие альтернативы помимо двух вышеупомянутых?
  5. Что, если мне нужно несколько потребителей для определенных узлов в цепочке? например Потребитель потребляет данные, обрабатывает и передает их следующему в цепочке, но мы также должны регистрировать данные или сохранять их в базе данных.
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
451
2

Ответы 2

Похоже, вам следует использовать пошаговые функции, чтобы связать лямбда-выражения.

Похоже, что reactive streams (а не потоки Java или лямбды AWS) - лучший инструмент для вашей задачи. Они предоставляют:

  • противодавление, то есть уравновешивание скорости потребителей и производителей
  • параллельное выполнение всех этапов конвейерной цепочки
  • подключение нескольких потребителей для одного производителя

Существует ряд реализаций reactive streams: JavaRx2, Project Reactor (включен в Spring 5), Akka Streams и другие.

Другие вопросы по теме