我一直在研究各种通信技术/架构/模式/实现(也就是所谓的流行语),包括Web Services(WCF,Axis2),ESB,SOA,并且想更多地了解有关消息传递方面的JMS。
从概念上讲,JMS听起来很简单。我的理解是它是一个中间代理程序,用于管理发布者的消息并将其路由到适当的订阅者。这是通过排队发布的消息并在接收时出列来完成的。
问题1:我对JMS的基本理解正确吗?
在阅读有关技术的文章时,其中某些特性可能存在一定程度的(故意或无意的)夸大其词,这是令人困扰的事情之一。
根据我对JMS的基本理解,必须运行JMS提供程序才能发送或接收消息。我对发布的假设是,JMS提供程序只是等待消息被发布,然后将其存储在队列中(内存或数据库支持,具体取决于实现方式)。但是,我不太确定如何接收。
问题2:如果没有可用的消息,接收(通常)是否会阻塞?
问题2b:如果是,如何实现阻塞?客户端是否不断轮询消息?服务器是否仅在发布消息时才会响应(这样做如何避免超时问题?)?提供程序是否会发起对接收方的调用?
问题2c:如果不是,如何确保及时接收消息,而不影响性能?
基本描述似乎倾向于单个JMS提供程序,以确保消息得到集中管理而不会丢失。我可以看到缩放是一个问题。
问题3:JMS如何进行缩放?
在缩放时,我可以看到确保将单个消息传递给所有适当的订阅者的复杂性,无论哪个物理服务器接收该消息。
问题3b:JMS实现如何在缩放环境中确保可靠传递?
请注意,尽管这些问题与JMS相关,但它们可能适用于任何消息基础结构。我欢迎特定于JMS的答案,也欢迎更一般或甚至特定于其他技术的答案。