JMS 接收如何在内部工作?
我一直在研究各种通信技术/架构/模式/实现(阅读:流行语),包括Web服务(WCF,Axis2),ESB,SOA,并希望了解有关JMS的更多信息。
从概念上讲,JMS听起来很简单。我的看法是,它是一个中间代理,它管理来自发布者的消息并将其路由到适当的订阅者。这是通过在发布消息时对消息进行排队,并在收到消息时对消息进行取消排队来完成的。
问题 1:我对 JMS 的基本理解是否正确?
在阅读有关技术的内容时,让我烦恼的一件事是,当对某个功能进行一定程度的(有意或无意的)挥手时。
根据我的基本理解,JMS 提供程序必须运行才能发送或接收消息。我对发布的假设是,JMS 提供程序只是等到消息发布,然后将其存储在队列中(内存或数据库支持,具体取决于实现)。但是,我不太确定接收是如何工作的。
问题 2:如果没有可用的消息,接收(通常)是否会阻塞?
问题2b:如果是这样,如何实现阻止?客户端是否持续轮询消息?服务器在发布消息之前是否根本没有响应(如何在不超时的情况下工作?提供程序是否启动对收件人的呼叫?
问题 2c:如果没有,如何确保及时接收消息,而不会影响性能?
基本描述似乎倾向于单个 JMS 提供程序,以确保消息得到集中管理而不会丢失。我可以看到缩放是一个问题。
问题 3:JMS 如何扩展?
在扩展时,我可以看到确保将单个消息传递给所有适当的订阅者的复杂性,而不管哪个物理服务器接收消息。
问题 3b:JMS 实现如何确保在扩展环境中可靠地交付?
请注意,尽管这些问题与 JMS 相关,但它们可能适用于任何消息传递基础结构。我欢迎特定于JMS的答案,以及那些更通用甚至特定于其他技术的答案。