【发布时间】:2011-08-22 13:41:10
【问题描述】:
我一直在研究各种通信技术/架构/模式/实现(阅读:流行语),包括 Web 服务(WCF、Axis2)、ESB、SOA,并且想了解有关消息传递方面 JMS 的更多信息。
从概念上讲,JMS 听起来很简单。我的看法是,它是一个中间代理,它管理来自发布者的消息并将它们路由到适当的订阅者。这是通过在消息发布时将消息排队并在收到消息时将其出列来完成的。
问题一:我对 JMS 的基本理解正确吗?
在阅读有关技术的文章时,让我感到困扰的一件事是,当某项功能发生某种程度的(有意或无意的)挥手时。
根据我的基本理解,必须运行 JMS 提供程序才能发送或接收消息。我对发布的假设是 JMS Provider 只是等待消息发布,然后将其存储在队列中(内存或数据库支持,取决于实现)。但是,我不太确定接收是如何工作的。
问题 2:如果没有可用的消息,接收(通常)会阻塞吗?
问题 2b:如果是这样,如何实现阻塞?客户端是否不断轮询消息?服务器是否只是在消息发布之前不响应(如何在没有超时的情况下工作?)提供者是否向接收者发起调用?
问题 2c:如果不是,如何确保及时收到消息而不影响性能?
基本描述似乎倾向于单个 JMS 提供程序,以确保消息得到集中管理而不会丢失。我可以看到缩放是一个问题。
问题 3:JMS 如何扩展?
在扩展时,我可以看到确保将单个消息传递给所有适当的订阅者的复杂性,无论哪个物理服务器接收消息。
问题 3b:JMS 实施如何确保在扩展环境中可靠交付?
请注意,尽管这些问题与 JMS 有关,但它们可能适用于任何消息传递基础架构。我欢迎针对 JMS 以及更通用甚至针对其他技术的答案。
【问题讨论】:
标签: java jms message-queue messaging