Оказывается ли Акка Камел?

Мое понимание Акки заключается в том, что она обеспечивает модель, при которой несколько изолированных потоков могут взаимодействовать друг с другом очень быстро. В нем используется "модель актера", где каждый поток является "актером" с определенным заданием. Вы можете организовать, какие сообщения передаются каким субъектам при каких условиях.

Я использовал Camel раньше, и для меня это похоже на то, что он потерял свой блеск/полезность теперь, когда Akka настолько зрелая и хорошо документирована. Насколько я понимаю, Camel занимается корпоративной интеграцией, то есть интегрирует несколько несопоставимых систем вместе, как правило, в какой-то форме служебной шины.

Но подумайте: если я в настоящее время использую Camel для:

  • Опросите FTP-сервер для файла и после его обнаружения...
  • Преобразование содержимого этого файла в POJO, затем...
  • Отправьте сообщение, если POJO имеет определенное состояние, или
  • Сохранять POJO в базе данных во всех других случаях.

Я могу сделать то же самое с Аккой; У меня может быть 1 Актер для каждого из этих шагов (опрос FTP, преобразование файла → POJO, электронная почта или сохранение), связать их вместе и позволить Akka обрабатывать всю асинхронность / concurrency.

Итак, несмотря на то, что Akka - это структура concurrency (с участием актеров), и хотя Camel об интеграции, я должен спросить: не может Akka решить все, что делает Camel? В словах: Какие существуют варианты использования Camel над Akka?

Ответ 1

Акка и верблюд - это два разных зверя (кроме того, один - гора, а один - животное).

Вы упомянули сами: Akka - это инструмент для реализации шаблона реактора, то есть основанный на сообщения механизм concurrency для потенциально распределенных систем.

Camel - это DSL/фреймворк для реализации корпоративных интеграционных шаблонов.

Есть много вещей, которые были бы хороши, хотя в Акке, что легко в Camel. Сделки наверняка. Тогда вся логика различной транспортной логики и опций, так как Akka не имеет абстракции для сообщения интеграции. Тогда есть хорошо разработанные EIP, которые великолепны в Camel, многоадресной рассылке, разбиении, агрегации, обработке XML/JSON, разборе текстовых файлов, HL7, чтобы упомянуть лишь некоторые из них. Конечно, вы можете сделать все это в чистом java/ scala, но это не так. Суть заключается в том, чтобы описать интеграцию с использованием DSL, а не для реализации базовой логики еще раз.

Тем не менее, Akka TOGETHER с Camel довольно интересен. Особенно рекомендуется использовать Scala. Затем у вас есть EIP поверх семантики актера, которая довольно эффективна на правой арене.

Пример из akka.io

import akka.actor.Actor
import akka.camel.{ Producer, Oneway }
import akka.actor.{ ActorSystem, Props }

class Orders extends Actor with Producer with Oneway {
  def endpointUri = "jms:queue:Orders"
}

val sys = ActorSystem("some-system")
val orders = sys.actorOf(Props[Orders])

orders ! <order amount="100" currency="PLN" itemId="12345"/>

Полный образец/учебник можно найти в typesafe.