草庐IT

java - 何时使用参与者而不是消息传递解决方案,例如 WebSphere MQ 或 Tibco Rendezvous?

coder 2023-04-27 原文

我已经阅读了 What design decisions would favour Scala's Actors instead of JMS? 的问题和答案.

通常,我们使用已经存在多年的消息传递解决方案:要么使用 JMS 实现(如 WebSphere MQ 或 Apache ActiveMQ)进行点对点通信,要么使用 Tibco Rendevous 进行多播消息传递。

它们非常稳定,经过验证并提供高可用性和性能。然而,配置和设置似乎比 Akka 复杂得多。

对于迄今为止已成功使用上述产品(WebSphere MQ 或 ActiveMQ)的某些用例,何时以及为何应使用 Akka?为什么我应该在 future 的项目中考虑使用 Akka 而不是 WebSphere MQ 或 Tibco RV?

我什么时候应该避免使用 Akka?它是否提供与其他解决方案相同的高可用性和性能?或者甚至将 Akka 与其他消息传递中间件进行比较是一个坏主意?

也许除了 JMS(点对点)、TibcoRV(多播)和 Akka 之外,我还应该考虑 JVM 环境中的另一种消息传递解决方案?

最佳答案

首先,“较旧的”消息系统 (MQ) 在实现上较旧,但它们在工程理念上较新:事务持久队列。 Scala Actors 和 Akka 可能是较新的实现,但构建在较旧的 Actors 并发模型之上。

然而,这两个模型在实践中非常相似,因为它们都是基于事件消息的:请参阅我对 RabbitMQ vs Akka 的回答。 .

如果您只想为 JVM 编写代码,那么 Akka 可能是一个不错的选择。否则我会使用RabbitMQ。

此外,如果您是 Scala 开发人员,那么 Akka 应该是显而易见的。然而,Akka 的 Java 绑定(bind)不是很像 Java 风格,并且由于 Scala 的类型系统需要进行转换。

同样在 Java 中,人们通常不会创建不可变对象(immutable对象),我建议您为消息传递这样做。因此,在 Java 中很容易意外地使用 Akka 做一些不会扩展的事情(使用可变对象作为消息,依赖于奇怪的闭包回调状态)。使用 MQ 这不是问题,因为消息总是以速度为代价进行序列化。对于 Akka,它们通常不是。

与大多数 MQ 相比,Akka 在拥有大量消费者的情况下也能更好地扩展。这是因为对于大多数 MQ(JMS、AMQP)客户端来说,每个队列连接都需要一个线程……因此很多队列 == 很多永久运行的线程。不过,这主要是客户端问题。我认为 ActiveMQ Apollo 有一个非阻塞调度程序,据称可以为 AMQP 解决这个问题。 RabbitMQ 客户端具有允许您组合多个消费者的 channel ,但仍然存在大量消费者可能导致死锁或连接死亡的问题,因此通常会添加更多线程来避免此问题。

话虽如此 Akka's remoting是相当新的,可能仍然没有提供传统消息队列提供的所有可靠消息保证和 QoS(但每天都在变化)。它通常也是点对点的,但我认为它是否支持服务器对点,这通常是大多数 MQ 系统所做的(即单点故障),但有些 MQ 系统是点对点的(RabbitMQ 是服务器-对等)。

最后 RabbitMQ 和 Akka 实际上是一对很好的搭档。 您可以使用 Akka 作为 RabbitMQ 的包装器,特别是因为 RabbitMQ 不能帮助您处理消息的消耗和本地路由消息(在单个 JVM 中)。

何时选择 Akka

  • 拥有大量消费者(想想数百万)。
  • 需要低延迟
  • 开放Actor并发模型

  • 示例系统:交互式实时聊天系统

    何时选择 MQ
  • 需要与许多不同的系统(即非 JVM)集成
  • 消息可靠性比延迟更重要
  • 想要更多工具和管理 UI
  • 因为前面的观点更适合长时间运行的任务
  • 想使用与 Actors 不同的并发模型

  • 示例系统:调度事务批处理系统

    根据相关评论进行编辑

    我假设 OP 与分布式处理有关,这两个 Akka和消息队列可以处理。那是我假设他在谈论 distributed Akka . 与大多数消息队列相比,使用 Akka 进行本地并发是一个苹果与橙色的对比 .我说最多是因为你可以在本地应用消息队列模型作为并发模型(即主题、队列、交换),这两个 Reactor图书馆和 simple-react做。

    选择正确的并发模型/库对于低延迟应用程序非常重要。诸如消息队列之类的分布式处理解决方案通常并不理想,因为路由几乎总是通过线路完成,这显然比在应用程序中慢,因此 Akka 将是更好的选择。但是我相信一些专有的 MQ 技术允许本地路由。同样正如我之前提到的,大多数 MQ 客户端对线程非常愚蠢,并且不依赖非阻塞 IO 并且每个连接/队列/ channel 都有一个线程......具有讽刺意味的是,非阻塞 io 并不总是低延迟,但通常是更多资源高效。

    正如您所看到的,分布式编程和并发编程的主题相当大并且每天都在变化,所以我的初衷不是混淆而是专注于分布式消息处理的一个特定领域,这正是我认为 OP 所关注的。在并发方面,人们可能希望将他们的搜索重点放在“响应式(Reactive)”编程(RFP/流)上,这是一种“较新”但类似于参与者模型和消息队列模型的模型,所有这些模型通常可以组合在一起,因为它们是基于事件的。

    关于java - 何时使用参与者而不是消息传递解决方案,例如 WebSphere MQ 或 Tibco Rendezvous?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5693346/

    有关java - 何时使用参与者而不是消息传递解决方案,例如 WebSphere MQ 或 Tibco Rendezvous?的更多相关文章

    1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

      在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

    3. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    4. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

      我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

    5. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

      我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

    7. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    9. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

      相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

    10. 【高数】用拉格朗日中值定理解决极限问题 - 2

      首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

    随机推荐