Я новичок в модели акторов, поэтому я думаю, что уже существуют устоявшиеся шаблоны для моего обычно выглядящего сценария с такими прекрасными составными абстракциями, как актеры и фьючерсы.
У меня есть асинхронные операции со следующими требованиями:
- Они используют устаревшую систему, отправляя низкоуровневый запрос, а затем отслеживая состояние объекта с помощью опроса. Таким образом, результат фактической операции доступен только в отложенном виде, запрашивающие должны быть уведомлены, когда наблюдаемое состояние достигает желаемого состояния.
- Эти операции могут выполняться только после завершения некоторых других операций, которые они должны ожидать параллельно.
- Операции можно отменить. Конечно, уже отправленные низкоуровневые запросы нельзя отменить; отмена означает, что фактическая операция не выполняется после завершения операций, от которых мы зависим, и, конечно, это должно распространяться рекурсивно (если мы ждем зависимости и у нее есть несколько ожидающих операций, не запускайте их).
Я думаю о фьючерсах: первое требование можно решить, например. Akka's map
/flatMap
, второй с комбинатором traverse
без процедурной поддержки зависимостей/зависимых. Но я не могу придумать решение для отмены; фьючерсы не могут быть отменены, и если они составлены, их компоненты недоступны. Как функционально инкапсулировать «отменить текущую операцию»? Поддерживает ли это какой-либо из фреймворков для Scala?