Java 集群环境中JMS主题的HTTP使用者

Java 集群环境中JMS主题的HTTP使用者,java,http,session,jakarta-ee,jms,Java,Http,Session,Jakarta Ee,Jms,我已经看到了这个问题的点点滴滴,但没有什么能直接回答它 以下是假设的环境: 20台以Java为中心的服务器,即Tomcat/Glassfish/Jboss/where 通过HTTP与客户端对话 服务器前面的HTTP负载平衡器不保证 使用每个客户端连接将您带回同一服务器。 从技术角度看,其他任何东西都是可用的。JMS/Camel/ Memcached/Hazelcast/随便什么 我们希望Joe和他的浏览器可能使用Flash或HTML5或任何客户端技术来接收发布到JMS主题的所有消息,该主题可供所

我已经看到了这个问题的点点滴滴,但没有什么能直接回答它

以下是假设的环境:

20台以Java为中心的服务器,即Tomcat/Glassfish/Jboss/where 通过HTTP与客户端对话 服务器前面的HTTP负载平衡器不保证 使用每个客户端连接将您带回同一服务器。 从技术角度看,其他任何东西都是可用的。JMS/Camel/ Memcached/Hazelcast/随便什么 我们希望Joe和他的浏览器可能使用Flash或HTML5或任何客户端技术来接收发布到JMS主题的所有消息,该主题可供所有20台服务器使用

以下是一个例子:

Joe的第一个HTTP连接击中了服务器A 服务器A现在通过cookies等为Joe提供HTTP会话 服务器A根据他的会话ID等为他订阅主题 Joe的HTTP连接结束。 将向主题发布一条消息。 Joe建立了另一个连接,但这次由服务器F处理。 对我来说,这就是事情变得有点模糊的地方

我们知道Joe返回时的会话ID,可能会话在所有服务器上共享,但是JMS订阅呢?如果服务器F必须再次订阅Joe的主题,他是否错过了一条消息?是Joe可以从中检索消息的唯一服务器,还是当他在F上订阅并且它只知道他没有在A上收到消息时,会发生某种魔法。 我想我有点不清楚订阅在流程方面做了什么,以及它与集群服务器的关系。我正在使用长轮询CeMeD和WebSoCuto来帮助客户端在接收主题消息时的响应性,但是必须考虑当有许多服务器能够处理连接和订阅时,这将如何工作。我希望避免服务器固定

谢谢你的指点


编辑1:希望能澄清一下。我这里指的是BlazeDS框架中提供的一些特定内容。它允许HTTP客户机订阅JMS主题,并使用长轮询来实现近实时的客户机更新,但它要求一旦客户机访问服务器,所有请求都必须返回到该服务器。那一定是什么原因?保持该服务器上该客户端的主题订阅处于活动状态。我想用任何技术/框架来消除这种需求。

JMS服务器跟踪所做的每个订阅,并区分持久订阅和非持久订阅。假设您有客户机A、B、C和主题T

客户端A订阅主题T并等待消息 客户端B订阅主题T等待消息 客户端C对主题T进行持久订阅并等待消息 客户端B和C在消息M被放入主题T前几秒钟崩溃 客户端A获得消息M的副本,因为它已订阅并且当前已连接到jms服务器 客户端B将重新启动,但不会获取消息的副本,因为当消息到达主题时,它未连接到jms服务器 客户端C重新启动并获取消息M,因为它提供了一个持久订阅,JMS服务器在C崩溃时保留了消息M的一个副本,并等待C返回并声明消息。 消息服务器上有一些管理设置,用于控制jms服务器在将消息发送到死信队列之前等待持久订阅者返回并声明消息的时间长度,或者控制等待订阅者返回并声明消息的主题上的最大消息数。您确实需要平衡从不丢失消息与流消息之间的关系,以及内存或磁盘空间的不足

请注意,持久队列的概念不同于持久订户的概念。持久队列和主题通过在确认收到消息之前将队列和消息的内容写入磁盘来保护您免受JMS服务器崩溃的影响。持久订户是指当客户机未连接时,消息到达时消息会发生什么情况

老答案

以SQL数据库的方式来考虑JMS服务器。从web容器的角度来看,应该有一个到JMS服务器的连接池,因此您要做的是获取到JMS服务器的连接并订阅一个主题。比如说

JMS服务器有一个名为AddressChangeTopic的主题 每个tomcat实例都订阅了AddressChangeTopic Joe/Jim/John的地址更改事件。。。等都去同一个地址ChangeTopic而不是去JohnAddressTopic,JimAddressTopic。。。等等,为一个应用程序为每个用户创建一个单独的主题是不切实际的。如果你有100万用户,你会有100万个主题吗? 因此,如果正在使用一个主题,您必须使用选择性使用者来使用该主题中的消息,看看选择性使用者会做什么 do是从主题中检索符合特定条件的消息。例如,将JMS消息发布到主题的消息生产者应该包含一个标题或一个名为targetUser的JMS属性或类似的内容,然后消费者可以说给出来自AddressChangeTopic的任何消息,其中自定义属性targetUser=Joe参见一些示例选择器示例


关键是要认识到,您可以像查询数据库表那样查询队列或主题,但查询语法非常有限。从概念的角度来看,我强烈推荐《企业集成模式》一书。JMS服务器跟踪所做的每个订阅,并区分持久订阅和非持久订阅。假设您有客户机A、B、C和主题T

客户端A订阅主题T并等待消息 客户端B订阅主题T等待消息 客户端C对主题T进行持久订阅并等待消息 客户端B和C在消息M被放入主题T前几秒钟崩溃 客户端A获得消息M的副本,因为它已订阅并且当前已连接到jms服务器 客户端B将重新启动,但不会获取消息的副本,因为当消息到达主题时,它未连接到jms服务器 客户端C重新启动并获取消息M,因为它提供了一个持久订阅,JMS服务器在C崩溃时保留了消息M的一个副本,并等待C返回并声明消息。 消息服务器上有一些管理设置,用于控制jms服务器在将消息发送到死信队列之前等待持久订阅者返回并声明消息的时间长度,或者控制等待订阅者返回并声明消息的主题上的最大消息数。您确实需要平衡从不丢失消息与流消息之间的关系,以及内存或磁盘空间的不足

请注意,持久队列的概念不同于持久订户的概念。持久队列和主题通过在确认收到消息之前将队列和消息的内容写入磁盘来保护您免受JMS服务器崩溃的影响。持久订户是指当客户机未连接时,消息到达时消息会发生什么情况

老答案

以SQL数据库的方式来考虑JMS服务器。从web容器的角度来看,应该有一个到JMS服务器的连接池,因此您要做的是获取到JMS服务器的连接并订阅一个主题。比如说

JMS服务器有一个名为AddressChangeTopic的主题 每个tomcat实例都订阅了AddressChangeTopic Joe/Jim/John的地址更改事件。。。等都去同一个地址ChangeTopic而不是去JohnAddressTopic,JimAddressTopic。。。等等,为一个应用程序为每个用户创建一个单独的主题是不切实际的。如果你有100万用户,你会有100万个主题吗? 因此,如果正在使用一个主题,您必须使用选择性使用者来使用该主题中的消息,请查看选择性使用者将执行的操作是从符合特定条件的主题中检索消息。例如,将JMS消息发布到主题的消息生产者应该包含一个标题或一个名为targetUser的JMS属性或类似的内容,然后消费者可以说给出来自AddressChangeTopic的任何消息,其中自定义属性targetUser=Joe参见一些示例选择器示例


关键是要认识到,您可以像查询数据库表那样查询队列或主题,但查询语法非常有限。从概念的角度来看,我强烈推荐《企业集成模式》一书,它用我所掌握的更为简洁的词语描述了问题和解决方案:-请参阅JMS持久主题的局限性

它用我掌握的更为简洁的词语描述了问题和解决方案:-请参阅JMS的局限性持久话题

感谢您的回复。我熟悉EIP/Camel以及如何查询JMS以过滤或路由特定消息,例如ActiveMQ/RabbitMQ。我的问题更多的是当订阅在系统a上创建,然后我们在另一个系统上创建一个新订阅时,会发生什么。如果我在不同的系统上有多个使用相同筛选器的订阅,我会丢失邮件吗?或者JMS是否足够聪明,知道我在切换机器时还没有使用主题消息。@h1h3m3我已经更改了我的答案,因为我更好地理解了你的问题,希望我的答案是你想要的。再次感谢更新,但仍然不是我需要的。我需要更好地描述我的问题。这不一定是关于耐用性,而是关于订阅。如果我在服务器A上订阅并且它在该服务器上的内存中处于活动状态,那么我将失去与服务器A的连接,连接到服务器
r B对我来说还没有连接到主题,B会接收正在等待的消息还是a已经使用了它?如果没有活动http连接,即订阅,但没有接收,我不太清楚活动订阅实际上意味着什么。我用编辑更新了原始问题,希望有助于澄清一些细节。感谢回复。我熟悉EIP/Camel以及如何查询JMS以过滤或路由特定消息,例如ActiveMQ/RabbitMQ。我的问题更多的是当订阅在系统a上创建,然后我们在另一个系统上创建一个新订阅时,会发生什么。如果我在不同的系统上有多个使用相同筛选器的订阅,我会丢失邮件吗?或者JMS是否足够聪明,知道我在切换机器时还没有使用主题消息。@h1h3m3我已经更改了我的答案,因为我更好地理解了你的问题,希望我的答案是你想要的。再次感谢更新,但仍然不是我需要的。我需要更好地描述我的问题。这不一定是关于耐用性,而是关于订阅。如果我订阅了服务器A,并且它在该服务器上的内存中处于活动状态,那么我将失去与服务器A的连接,连接到服务器B,而服务器B尚未与我的主题建立连接,B是否会接收正在等待的邮件,或者A是否已经使用了该邮件?如果没有活动的http连接,即订阅,但没有接收,我有点不清楚活动订阅实际上意味着什么。我用编辑更新了原始问题,希望有助于澄清一些细节。