【问题标题】:Dynamically messaging vs Latency design issue动态消息传递与延迟设计问题
【发布时间】:2013-02-12 23:40:44
【问题描述】:

我想从您的经验中了解您对我的设计的看法。

我正在设计一个具有非常关键部分的系统:

我有组件 A、B、C(在同一个 JVM 上)需要相互“对话”。

我可以有两种方法:

  1. 方法调用方式(各自持有对方实例(注入、对象实例等)。

  2. 消息方式(主题/队列)

我知道使用中间件混乱系统(选项 2)的缺点。

但是:

我说的是延迟注意事项。 我需要让这些消息以低延迟(谈论毫秒延迟)到达目标。

我想选择选项 2(消息传递方式)。

根据您的经验,它会在多大程度上影响我的延迟?延迟再次是这个决定的一个非常重要的因素。

(使用 Java 编程,还不确定哪个应用程序容器(Spring、Jboss..)

谢谢, 射线。

【问题讨论】:

  • this thread 对这个问题有一些好的想法。
  • 看了看.. 用那里给出的例子找不到足够有经验的想法。
  • 我会说一步一步。从注射开始,看看您是否遇到了需要进一步研究的问题。然后可能是一个线程池和一个队列就足够了。只有当我产生足够多的需要消息系统的消息时,我才会查看消息框架。
  • @javausersoma 我喜欢消息传递框架,因为根据我的经验,它是一个非常动态\易于维护\松散耦合的环境。但当然,如果权衡是延迟,则需要重新考虑。

标签: java performance jakarta-ee architecture jms


【解决方案1】:

鉴于消息传递方式是在内存中,在同一个 JVM 中。然后通常大多数延迟来自争用(使用同步等)、调度(如何唤醒线程以完成其工作等)和 GC 的组合。这些延迟来源往往会使其他一切相形见绌。

可以编写不增加太多开销的相当轻量级的消息传递系统。 Akka 就是一个很好的例子,它越来越多地进入低延迟金融系统。它在 Scala 领域更为人所知,但它确实有一个 Java API。

总之,一个消息传递系统可以实现亚毫秒级的需求。但是,请确保它首先满足您的需求。仅仅因为你可以,并不意味着你应该。如果你在一个小型系统上工作,那么依赖注入/控制反转可能就是你需要有一个好的设计的全部。但是,如果您正在将消息传递视为将多个 cpu 内核混合在一起的一种方式,或者类似的方式,那么我建议您看看 Akka。即使只是作为案例研究。

【讨论】:

  • 我还应该建议你最好从一个简单的设计开始,测量它,然后先根据反馈进行修改。这种方法往往胜过大多数其他考虑因素。
  • 即使我使用 Akka.. 使用主题而不是方法调用.. 它会影响延迟多少?
  • Akka 消息传递有大约 1-2 微秒的延迟:jinspired.com/site/…
  • Akka可以集成在Spring里面吗?我看到它是为 Scala 编写的,不是吗?
  • Martin Thompson 写了很多关于如何编写低延迟队列的文章。谷歌他的名字,他是 LMAX 颠覆者模式背后的人。 Java 执行器每秒执行大约 300 万次操作。有可能达到至少 50m,并且以每秒 200m 的速度推动边界并非闻所未闻。这些时序取自 i7 四核 mac book pro。
猜你喜欢
  • 2022-12-14
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多