Akka 是不是淘汰了 Camel?
Posted
技术标签:
【中文标题】Akka 是不是淘汰了 Camel?【英文标题】:Does Akka obsolesce Camel?Akka 是否淘汰了 Camel? 【发布时间】:2015-03-20 09:15:45 【问题描述】:我对 Akka 的理解是它提供了一个模型,多个独立的线程可以通过这种模型以高度并发的方式相互通信。它使用“演员模型”,其中每个线程都是有特定工作要做的“演员”。您可以协调在什么条件下将哪些消息传递给哪些参与者。
我以前使用过 Camel,对我来说,现在 Akka 如此成熟且有据可查,我觉得它有点失去了光彩/实用性。据我了解,Camel 是关于企业集成,即将多个不同的系统集成在一起,通常以某种服务总线方式。
但是想一想:如果我目前使用 Camel 来:
轮询 FTP 服务器以获取文件,一旦找到... 将该文件的内容转换为 POJO,然后... 如果 POJO 具有某种状态,则发送电子邮件,或者 在所有其他情况下将 POJO 持久化到数据库中我可以用 Akka 做同样的事情;我可以为每个步骤(轮询 FTP、转换文件 -> POJO、电子邮件或持久化)设置 1 个 Actor,将它们连接在一起,然后让 Akka 处理所有异步/并发。
所以即使 Akka 是一个并发框架(使用 Actor),即使 Camel 是关于集成的,我还是要问:Akka 不能解决 Camel 所做的所有事情吗?换句话说:仍然存在哪些使用 Camel 而不是 Akka 的用例?
【问题讨论】:
为什么在没有解释的情况下投反对票?这不是骗人的,显示了研究工作(从某种意义上说,我想出了一个确切的用例/场景),绝对与代码/编程相关,并且不违反 SSCCE 的任何内容!也许是一个心怀不满的 Camel 提交者? Akka 是一个工具包和运行时,用于在 JVM 上构建高度并发、分布式和弹性的消息驱动应用程序。 Camel 是一个 EIP。 Akka 是否实现了 EIP 模式?虽然 Akka 可以做 Camel 所做的事情,但这两个包的侧重点完全不同。 是的,在没有解释的情况下投反对票也是我的一个小烦恼。 【参考方案1】:阿卡和骆驼是两种不同的野兽(除了一种是山,一种是动物)。
你自己提到过: Akka 是一种实现反应器模式的工具,即用于潜在分布式系统的基于消息的并发引擎。
Camel 是实现企业集成模式的 DSL/框架。
虽然在 Akka 中有很多东西会很漂亮,但在 Camel 中很容易。交易肯定。然后是各种传输逻辑和选项的所有逻辑,因为 Akka 没有集成消息的抽象。然后是在 Camel 中非常出色的开发良好的 EIP,多播、拆分、聚合、XML/JSON 处理、文本文件解析、HL7,仅举几例。当然,你可以在纯 java/scala 中完成这一切,但这不是重点。重点是能够使用 DSL 来描述集成,而不是再次实现底层逻辑。
不过,Akka TOGETHER with Camel 非常有趣。特别是使用 Scala。然后,您在 actor 语义之上拥有 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"/>
完整的示例/教程can be found at typesafe。
【讨论】:
感谢@Petter (+1) - 我想这是有道理的。在您的特定“Akka w/Camel”示例中,我仍然没有通过树木看到森林:该代码中发生了什么?看起来您只是将 Order POJO 发送到 JMS 队列 - 我不能只在 Camel(没有 Akka)或仅使用 Akka(使用 JMS 客户端)中这样做吗?再次感谢! 当然,这是一个非常简单的例子。请阅读答案中的链接以获取更多示例和详细信息。它的本质是,即使是 akka 也将 Camel 推广为基于 Akka 的应用程序的集成层。 喜欢示例的最后一行!非常优雅地使用 Scala 的 XML 支持。以上是关于Akka 是不是淘汰了 Camel?的主要内容,如果未能解决你的问题,请参考以下文章
Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?