Akka是否淘汰了JMS / AMQP消息代理?[关闭]


19

我花了最后一周深入研究Akka文档最终了解了什么是actor系统,以及它们解决的问题。

传统的JMS / AMQP消息代理的理解(和经验)是,它们存在以提供以下功能:

  • 生产者和消费者之间的异步处理;和
  • 消息传递保证,包括持久性,重试和回退

但是,如果没有所有必需的基础架构和运营开销,Akka是否可以提供此服务?

  • 在Akka中,所有Actor通信都是异步且无阻塞的。和
  • 在Akka中,SupervisorStrategies存在完成重试,后备和升级的功能。如果也需要的话,可以将Actor配置为持久存储到几乎任何类型的商店。

因此,这让我感到奇怪:如果我的应用程序使用Akka,是否需要将JMS / AMQP代理(例如ActiveMQ,RabbitMQ,Kafka)带入图片?换句话说,是否曾经有过这样的用例,那就是基于Akka的新应用程序还需要引入新的 JMS / AMQP代理集群?为什么或者为什么不?

唯一的论点是,也许我的Akka应用程序必须与另一个系统集成。但是在那种情况下,Akka-Camel模块使Akka可以利用Camel详尽无穷的,几乎无限的集成功能列表(TCP,FTP,ZeroMQ,这个列表不胜枚举……)。

有什么想法吗?


3
您的最后一段难道不是Akka不会使消息经纪人过时的原因吗?例如,我正在开发一个Java应用程序,该应用程序通过符合JMS的消息代理与远程C ++应用程序进行交互。我可以使用Akka-Camel编写Java应用程序,但是由于C ++应用程序,我仍然需要代理。
Thomas Owens

嗯,谢谢@ThomasOwens(+1),但您(理所当然地)误解了我的问题。我将在几分钟后更改措辞,以使其更明显。我真正要问的是:如果我要构建Akka应用程序,是否需要引入新的 JMS / AMQP代理?我认为答案是“否”,因为Akka + Camel(同样我认为)解决了通常由经纪人解决的所有问题。在您的示例中,已经存在 JMS代理作为与C ++应用进行通信的方式。我没有将其与新的Akka应用程序一起添加。因此,Akka-Camel模块将为我处理消息传递。
smeeb 2015年

2
也许我误会了,但是Camel并没有取代JMS(例如),但是它提供了一个可用于通过JMS发送消息的接口。您可以用AMQP,RabbitMQ或XMPP替换JMS。在我的示例中,即使我的Java + Akka和C ++应用程序是全新的,为了使它们能够通过JMS进行通信,我仍然需要引入某种符合JMS的消息队列,然后我可以使用Akka-Camel来与之沟通。骆驼不提供经纪人,只是在多种协议中进行交流的手段。Akka-Camel提供了比Camel界面更熟悉的界面。
Thomas Owens

再次感谢@ThomasOwens(+1)-我想您只是在想这个:-)。在您的示例中,有一个现有的C ++应用程序-也许是一些旧系统,并且已有一个现有的JMS兼容代理,该C ++应用程序已经使用与外界集成。在这种情况下,就像您所说的那样,我的新Akka应用程序将使用Akka-Camel模块来生成该消息或从该Broker接收消息。但这不是我在这里的askin!我想知道是否有理由需要同时构建两件事:(1)我的新Akka应用程序,以及(2)一个JMS / AMQP代理,同时 ...
smeeb 2015年

3
您提到了Camel的无限集成功能,但无法与Nothing集成。它需要与之集成,否则您将只是享受对一系列未运行服务的支持。如果要使用Camel与某物集成,请启动JMS,HTTP或FTP服务器或某物。否则,它只是幸福地提供了无限的集成功能,而什么也没有集成。
Jimmy Hoffa

Answers:


12

演员模型

参与者模型是计算机科学策略,用于构建处理大量并发计算和状态处理的应用程序。这不是唯一的策略,而是一种经过很好测试,简单且可靠的方法,可将计算转移到参与者参与者通过一次一次并有序地处理的消息进行通信。

Akka是一个框架,它实现了actor模型,并允许您使用已经构建的所有基础结构和功能来构建actor系统(例如使用JQuery代替javascript)。

讯息传递

消息系统是可以发送和检索消息的应用程序。从基本队列到具有主题,发布/订阅,持久性和其他功能的大型企业软件,种类繁多,但最终目标是相同的。将一些字节保存在某处,然后以某种顺序再次检索它们。今天的主要用例是使系统解耦,并允许以不同的时间表或速度进行异步处理。RabbitMQ,NATS,Kafka等都是消息系统的示例。

比较方式

Actor模型和Akka框架是低级工具,是构建应用程序(如消息队列)的绝佳方法。

您可以使用Akka代替消息队列吗?当然。如果要构建已经使用actor模型的软件,则可能不需要外部消息队列,尤其是在同一线程或应用程序内发送消息时。您可以使用Akka Remoting功能甚至将消息发送到在其他计算机上运行的其他actor系统。

但是,这会使消息传递系统过时吗?绝对不。仅仅因为您可以自己编写所有这些代码并不意味着您需要这样做,尤其是当参与者模型不适用于您的问题或者您需要不同的语言,应用程序,外部API,操作系统,数据库等进行通信时彼此之间(无论它们是否是角色系统)。

如果只需要在两个系统之间传递某些消息,请使用消息队列。如果您需要在同一应用程序中进行可伸缩的状态处理和低延迟消息传递,请使用参与者模型。它们都存在于完全不同的级别,并且您如何使用它们取决于所构建的解决方案。


关于相同的参与者模型与消息传递,有一个很好的答案:https : //stackoverflow.com/questions/5693346/when-to-use-actors-instead-of-messaging-solutions-such-as-websphere-mq-奥蒂科

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.