Akka vs Java 7 Futures

Я пытаюсь понять, когда использовать Akka Futures и нашел эту статью немного более полезными, чем основные документы Akka. Таким образом, похоже, что Akka Futures делает то же самое, что Java 7 Futures. Поэтому я спрашиваю:

  • Вне контекста актерской системы, какие преимущества Фьючерсы Akka имеют над Java Futures? Когда использовать каждый?
  • В контексте актерской системы, зачем когда-либо использовать будущее Akka? Не все ли актерские сообщения асинхронны, одновременно и не блокируются?

Ответы

Ответ 1

Akka Futures реализует асинхронный способ связи, в то время как Java7 Futures реализует синхронный подход. Да, они делают то же самое - общение - но совершенно по-другому.

Папка производителя-потребителя может взаимодействовать двумя способами: синхронно и асинхронно. Синхронный способ предполагает, что потребитель имеет свой собственный поток и выполняет операцию блокировки для получения следующего подготовленного сообщения, например. BlockingQueue.take(). В асинхронном подходе потребитель не имеет нити, это всего лишь объект с по меньшей мере двумя способами: хранить сообщение и обрабатывать его. Производитель вызывает метод store, так же как он вызывает Queue.put(m) в синхронном подходе, но этот метод также инициирует выполнение метода обработки потребителя в общем пуле потоков.

UPDT Что касается второго вопроса (зачем когда-либо использовать будущее Akka): Будущее создание выглядит (и есть) проще, чем у Актера; код для цепочки фьючерсов более компактен и более нагляднее, чем у Actors. Однако обратите внимание, что будущее может передавать только одно значение (сообщение), в то время как актер может обрабатывать последовательность сообщений. Но последовательности можно обрабатывать с помощью Akka Streams. Поэтому возникает вопрос: зачем когда-либо использовать Акку Актеры? Я приглашаю более опытных разработчиков ответить на этот вопрос. Как правило, я думаю, что если ваша задача может быть решена с помощью Futures, тогда используйте Futures, иначе, если с Streams, используйте Streams, иначе, если с Аккой Актеры, затем используйте Actors, иначе ищите другую инфраструктуру.

Ответ 2

В первой части вашего вопроса я согласен с ответом Алексея Кайгородова.

Для второй части вашего вопроса:

Полезно использовать Future внутри, когда ответы с актерами необходимо комбинировать очень определенным образом. Например, скажем, что актеру Master необходимо выполнить несколько запросов на блокировку базы данных, а затем агрегировать их результаты, и поэтому Master отправляет каждый запрос в Worker и затем агрегирует ответы. Если результаты запроса могут быть агрегированы в любом порядке (например, Master просто суммирует количество строк или что-то еще), тогда имеет смысл Worker отправлять свои результаты в Master через обратный вызов. Однако, если результаты нужно объединить в очень определенном порядке, для каждого Worker проще сразу вернуть a Future и для Master, чтобы затем манипулировать этими Futures в правильном порядке. Это можно сделать и с помощью обратных вызовов, но тогда Master нужно было бы выяснить, какой результат запроса - разместить их в правильном порядке, и будет намного сложнее оптимизировать код (например, если результаты запроса1 могут быть немедленно агрегированы с результатами запроса2, то с помощью Future эта логика может перейти непосредственно в код отправки, где идентификаторы всех запросов уже известны, тогда как для использования обратного вызова требуется Master идентифицировать результат запроса, а также определить, может ли он агрегировать запрос с любыми другими результатами запроса, которые были возвращены).