JMS有什么好处?[已关闭]

2022-08-31 13:59:47

我正在寻找JMS是一个很好的解决方案的(简单)问题示例,以及为什么JMS在这些情况下是一个很好的解决方案的原因。过去,我只是使用数据库作为将消息从A传递到B的一种方式,而B不一定能立即处理消息。

这种系统的一个假设例子是,所有新注册的用户应在注册后24小时内收到一封欢迎电子邮件。出于参数的考虑,假设 DB 不记录每个用户注册的时间,而是将每个新用户的引用(外键)存储在pending_email表中。电子邮件发件人作业每 24 小时运行一次,向此表中的所有用户发送电子邮件,然后删除所有pending_email记录。

这似乎是应该使用JMS的那种问题,但我不清楚JMS对我描述的方法有什么好处。DB 方法的一个优点是消息是持久的。我知道JMS消息队列也可以持久化,但是在这种情况下,JMS和我描述的“数据库作为消息队列”方法之间似乎没有什么区别?

我错过了什么?- 唐


答案 1

JMS和消息传递实际上是关于2个完全不同的东西。

  • 发布和订阅(向感兴趣的尽可能多的消费者发送消息 - 有点像向邮件列表发送电子邮件,发件人不需要知道谁订阅了
  • 高性能可靠的负载平衡(消息队列)

查看有关队列与主题相比如何的详细信息

您正在谈论的情况是第二种情况,是的,您可以使用数据库表来模拟消息队列。

主要区别在于JMS消息队列是一个高性能的高并发负载均衡器,专为实现巨大的吞吐量而设计。通常每秒可以向许多进程和线程中的许多并发使用者发送数万条消息。这样做的原因是消息队列基本上是高度异步的 - 一个好的JMS提供者会提前将消息流式传输到每个使用者,以便一旦使用者可用,就有数千条消息可以在RAM中处理。这导致大量的吞吐量和非常低的延迟。

例如,想象一下使用数据库表编写Web负载平衡器:)

使用数据库表时,通常一个线程倾向于锁定整个表,因此在尝试实现高性能负载均衡器时,您往往会获得非常低的吞吐量。

但是像大多数中间件一样,这完全取决于您的需求。如果您的低吞吐量系统每秒只有几条消息 - 请随意使用数据库表作为队列。但是,如果您需要低延迟和高吞吐量 - 那么强烈建议使用 JMS 队列。


答案 2

在我看来,JMS和其他基于消息的系统旨在解决需要以下问题:

  • 异步通信:应用程序需要通知另一个应用程序已发生事件,而无需等待响应。
  • 可靠性。确保一次性且仅一次的消息传递。使用数据库方法,您必须“重新发明轮子”,特别是如果您有多个客户端正在读取消息。
  • 松耦合。并非所有系统都可以使用数据库进行通信。因此,JMS非常适合用于异构环境,这些环境具有可以跨系统边界进行通信的解耦系统。

推荐