Akka本身是否支持Integration Patterns?

时间:2015-01-27 19:05:30

标签: apache-camel akka actor thread-synchronization enterprise-integration

我是Akka的新手,我正在试图弄清楚它是否内置了对Enterprise Integration Patterns (EIP)的支持,或者我是否需要将这种类型的路由/集成委托给像Camel这样的框架。

在我的用例中,我有一个从源(文件)读取二进制样本的actor;这个演员被称为SamplerSamplerSample实例(消息)传递给名为SampleProcessors的actor字段。每个样本处理器都会执行与给定Sample不同的操作。根据处理Sample的处理器的结果,可能需要将其路由到1+其他SampleProcessor,或者可能所有处理都已完成。根据确切的SampleProcessor以及给定Sample的确切性质,Sample可能需要多次投放到其他收件人SampleProcessors的列表中。

这对我来说就像骆驼一样。

所以我问:

  • Akka是否内置了对路由,广播,多播和其他EIP的支持(如果是,它们是什么以及它们在哪里记录)?
  • 或者,我应该尝试将actor系统与Camel集成,在这种情况下,它会是什么样子?我知道有一个Camel-Akka组件,但我相信这只是用于将Camel总线与actor系统集成(而我需要一个服务总线 in 我的演员系统)
  • 或者,我应该在这里做自己的本土EIP /演员布线吗?

1 个答案:

答案 0 :(得分:4)

Akka本身不支持EIP,但有几种方法可以实现它。

无论如何,如果你想要一些方便的DSL,有一个比EIP更好的想法 - 就像用GoF-patterns完成的那样,你可以用功能组合+ Functors替换(实现)大多数EIP模式({{1 }和Monads(map)。换句话说,您可以将输入流视为无限集合。所以,

  • 处理器成为功能
  • 管道变成了仿函数,例如flatMap
  • 路由器和过滤器变为...... monad(val output1 = input.map(processor1).map(processor2)基于filter):

    flatMap

    val fork1 = output1.filter(routingCondition1).map(...)

  • 拆分为val fork2 = output1.filter(routingCondition2).map(...)flatMap

  • 聚合器变为catamorphisms,又称input.flatMap(x => Stream(x.submsg1, x.submsg2))(累加器通常应由某些存储支持)

这样的基于流的工作流已经为Akka实现,它被称为Akka Streams,它是Reactive Streams的实现,另请参阅this  和that条。

另一种选择是按原样使用Akka,actor保证顺序处理,因此您可以通过创建actor链来实现管道:

fold

如果你需要路由 - 它只是两个“下一个”的

class Processor1(next: ActorRef) extends Actor {
   def receive = {
      case x if filterCondition => 
      case x => next ! process(x)
   }
}

val processor2 = system.actorOf(Props[Processor2])
val processor1 = system.actorOf(Props[Processor1], processor2)

如果您需要保证路线之间没有比赛 - 请参阅this answer。对于cource,你可以直接使用actor来放弃整个DSL的想法。

P.S。是的,你仍然可以使用Camel作为端点--Akka有一些support。你可以使用Akka作为服务激活者。