我正在寻找JMS是一个很好的解决方案的问题的简单例子,也是JMS在这些情况下是一个很好的解决方案的原因。在过去,我只是简单地使用数据库作为将消息从A传递到B的方法,当消息不一定立即由B处理时。
此类系统的一个假设示例是,所有新注册的用户应在注册后24小时内收到欢迎电子邮件。为了便于论证,假设DB不记录每个用户注册的时间,而是将每个新用户的引用(外键)存储在pending_email表中。电子邮件发件人作业每24小时运行一次,向该表中的所有用户发送电子邮件,然后删除所有pending_email记录。
这似乎是应该使用JMS的那种问题,但我不清楚JMS对我所描述的方法有什么好处。 DB方法的一个优点是消息是持久的。我知道JMS消息队列也可以保留,但在这种情况下,JMS和我描述的“数据库作为消息队列”方法似乎没什么区别?
我错过了什么? - 唐
答案 0 :(得分:68)
JMS和消息传递实际上是两个完全不同的东西。
查看有关how a queue compares to a topic
的更多信息您正在谈论的情况是第二种情况,是的,您可以使用数据库表来模拟消息队列。
主要区别在于JMS消息队列是一种高性能,高并发的负载均衡器,专为大吞吐量而设计;在许多进程和线程中,您通常可以每秒向数个并发消费者发送数万条消息。原因是消息队列基本上是高度异步的 - good JMS provider will stream messages ahead of time to each consumer,因此只要消费者可用,就有数千条消息可以在RAM中处理。这导致了大量的吞吐量和非常低的延迟。
e.g。想象一下使用数据库表编写Web负载均衡器:)
使用数据库表时,通常一个线程会锁定整个表,因此在尝试实现高性能负载均衡器时,往往会产生非常低的吞吐量。
但是像大多数中间件一样,这一切都取决于你需要什么;如果你的低吞吐量系统每秒只有几条消息 - 可以随意使用数据库表作为队列。但如果您需要低延迟和高吞吐量 - 那么强烈建议使用JMS队列。
答案 1 :(得分:50)
在我看来,JMS和其他基于消息的系统旨在解决所需的问题:
答案 2 :(得分:7)
JMS实现是“推送”,因为您不必轮询队列以发现新消息,但是您注册了一个新消息到达后立即调用的回调。
答案 3 :(得分:5)
解决原始评论。最初描述的是(点对点)JMS的要点。然而,JMS的好处是:
您不需要自己编写代码(并且可能搞砸了逻辑,因此它不像您认为的那样持久)。此外,第三方impl可能比简单的数据库方法更具可扩展性。
jms处理发布/订阅,这比您给出的点对点示例稍微复杂一些
您不依赖于特定的实现,如果您的需求在未来发生变化,可以将其交换出来,而不会使用您的Java代码搞乱。
答案 4 :(得分:5)
JMS的一个优点是启用异步处理,这也可以通过数据库解决方案完成。但是,以下是JMS相对于数据库解决方案的其他一些好处
a)消息的消费者可以在远程位置。公开数据库以进行远程访问是危险的。您可以通过提供用于从数据库读取消息的附加服务来解决此问题,这需要更多的努力。
b)在数据库的情况下,消息使用者必须在数据库中轮询消息,其中当消息到达时JMS提供回调(如sk所述)c)负载平衡 - 如果有大量消息出现,很容易在JMS中拥有消息处理器池。
d)通常,通过JMS实现将比数据库路由更简单,更省力。
答案 5 :(得分:2)
JMS是一种用于在两个或多个客户端之间传输消息的API。它的规格是在JSR 914下定义的。
JMS的主要优点是通信实体的解耦性质 - 发件人不需要有关接收器的信息。其他优势包括集成异构平台,减少系统瓶颈,提高可扩展性以及更快响应的能力。
JMS只是一种接口/ API,必须实现具体的类。这些已经由各种组织/提供商实施。他们被称为JMS提供商。示例是IBM的WebSphere或Fiorano Softwares的FioranoMQ或Apache,HornetQ,OpenMQ等的ActiveMQ。使用的其他术语是管理对象(主题,队列,ConnectionFactories),JMS生产者/发布者,JMS客户端和消息本身。
所以回答你的问题 - what is JMS good for?
我想举一个实际的例子来说明它的重要性。
日间交易
此功能名为LVC(上次值缓存)
交易中股票价格由出版商定期公布。每个共享都有一个与之关联的主题,并将其发布到该主题。现在,如果您知道主题是什么,那么您必须知道消息不会像队列一样保存。消息发布时,消息将被发布给订阅者(例外情况是Durables订阅者获取从创建消息时发布的所有消息但是我们再次不希望得到太旧的股票价格,这会丢弃可能性使用它)。因此,如果客户想知道股票价格他创建订户,然后他必须等到下一个股票价格发布(这也不是我们想要的)。这是LVC进入画面的地方。每个LVC消息都有一个关联的密钥。如果使用LVC密钥(对于特定库存)发送消息,然后使用相同密钥发送另一个更新消息,则后者将覆盖前一个消息。当订户订阅主题(启用了LVC)时,订户将获得具有不同LVC密钥的所有消息。如果我们为每个上市公司保留一个独特的密钥,那么当客户订阅它时,它将获得最新的股票价格,并最终获得所有更新。
当然,这是使JMS如此强大的可靠性,安全性等因素之一。
答案 6 :(得分:1)
Guido有完整的定义。根据我的经验,所有这些都非常适合。
我见过的其中一个用途是在仓库中进行订单分发。想象一下,办公用品公司拥有相当数量的仓库,为大型办公室提供办公用品。这些订单将进入一个中心位置,然后分批进行正确的仓库分发。在大多数情况下,仓库没有或想要高速连接,因此通过拨号调制解调器将订单推送给他们,这就是异步进入的地方。电话线并不是那么重要,因此订单的一半可能会进入和这是可靠性很重要的地方。
答案 7 :(得分:1)
关键优势是解除不相关的系统,而不是让它们共享comon数据库或构建自定义服务来传递数据。
银行是一个敏锐的例子,其中使用日内消息来传递实时数据更改。源系统很容易在“墙上”发出消息;缺点是这些系统之间的合同方式很少,而且您通常会看到在消费者方面实施住院治疗。它几乎太松散了。
其他优势还包括对许多应用程序服务器等开箱即用的JMS支持以及所有相关工具:持久性,监控,报告和限制。
答案 8 :(得分:1)
答案 9 :(得分:0)
“数据库作为消息队列”解决方案对于任务来说可能很重要。 JMS解决方案的耦合程度较低,因为消息发送方不需要了解有关接收方的任何信息。这可以通过“数据库中的消息队列”中的一些额外抽象来实现,因此它不是一个巨大的胜利......此外,您可以以“发布和订阅”方式使用队列,这可以方便,具体取决于什么你想要完成。它也是进一步分离组件的好方法。如果您的所有通信都在一个系统中和/或具有应用程序可立即使用的日志非常重要,那么您的方法似乎很好。如果您在不同的系统之间进行通信,JMS是一个不错的选择。
答案 10 :(得分:0)