首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集群环境中JMS主题的HTTP使用者

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

Stack Overflow用户
提问于 2013-01-08 03:50:54
回答 2查看 1.6K关注 0票数 2

我见过这个问题的零碎部分,但没有什么能直接回答这个问题。

以下是假设的环境:

  • 20台以Java为中心的服务器(即Tomcat / Glassfish / Jboss /任何东西)通过HTTP与客户端进行通信
  • 服务器前面的HTTP负载均衡器不能保证将您带回到每个客户端连接的同一服务器。
  • 其他任何东西都是可用的,技术上是明智的。(JMS / Camel / Memcached / Hazelcast /任何其他)

我们希望Joe和他的浏览器(可能使用Flash或HTML5或任何客户端技术)接收所有发布到所有20个服务器都可用的JMS主题的消息。

以下是一个例子:

  • Joe的第一个HTTP连接访问服务器A
  • 服务器A现在有一个用于Joe的HTTP会话(通过cookie等)
  • 服务器A为他订阅主题(基于他的会话ID等)
  • 乔的HTTP连接结束。
  • 一条消息被发布到主题上。
  • Joe进行了另一个连接,但这一次由服务器F处理。

这里的事情对我来说有点模糊。

  • 我们知道Joe返回时的会话ID (可能会话在所有服务器之间共享),但是JMS订阅呢?如果服务器F必须再次订阅这个主题,他是不是错过了一条信息?是Joe可以从它那里检索消息的唯一服务器,或者当他在F上订阅时会发生某种魔法,它只知道他没有收到消息(大概是在A上等他)。

我想我有点不清楚什么是“订阅”(流程明智的),以及它与集群服务器之间的关系。我正在处理长轮询(cometd)和websockets,以便在接收主题消息时帮助客户端响应,但当有许多服务器可以处理连接和订阅时,我必须考虑这将如何工作。我想避免服务器钉死。

谢谢你的指点。

EDIT1 :希望能澄清一下。在这里,我指的是一些在BlazeDS框架中可用的特定内容。它允许HTTP客户机订阅JMS主题,并使用长轮询来实现近乎实时的客户端更新,但它要求客户端一旦到达服务器,所有请求都必须返回到该服务器。所以它必须(以某种方式?)保持该服务器上该客户端的主题订阅活动。我想摆脱这一需求(任何技术/框架)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-10 03:53:25

正是我一直在寻找的解决方案。 --它描述了问题和解决方案(用更简洁的话说:-) --参见“JMS持久性主题的局限性”

票数 0
EN

Stack Overflow用户

发布于 2013-01-08 05:08:35

JMS服务器跟踪所做的每一个订阅,并在持久订阅和非持久订阅之间做出区别。假设您有客户端A、B、C和一个主题T。

  1. 客户端A订阅主题T并等待消息
  2. 客户端B订阅主题T等待消息
  3. 客户端C对主题T进行持久订阅,并等待消息
  4. 客户端B和C在消息M放到主题T之前几秒钟就崩溃了
  5. 客户端A获得消息M的副本,因为它已订阅并当前连接到jms服务器
  6. 客户端B重新启动但没有得到消息的副本,因为当消息到达主题时它没有连接到jms服务器。
  7. 客户端C重新启动并获取消息M,因为它传递了持久的订阅,因此JMS服务器在C崩溃时保留了消息M的副本,并等待C返回并声明消息。

消息服务器上有管理设置,用于控制jms服务器等待持久订阅服务器返回并声明消息的时间长度,然后再将消息发送到死信队列或等待订阅服务器返回并声明的主题上的最大邮件数。您确实需要平衡永不松散的消息与流消息之间的关系,并耗尽内存或磁盘空间。

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

老答案。

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

  • JMS服务器有一个名为AddressChangeTopic的主题
  • 每个tomcat实例都有一个AddressChangeTopic订阅。
  • 乔/吉姆/约翰的地址更改事件..。等人都去同一个AddressChangeTopic,而不是去JohnAddressTopic,JimAddressTopic,.等等,为一个应用程序每个用户创建一个单独的主题是不切实际的,如果你有100万用户,你会有100万个主题吗?

因此,如果要使用一个主题,则必须使用选择性使用者使用该主题中的消息,请参见http://www.eaipatterns.com/MessageSelector.html,选择使用者将做的是从符合特定条件的主题中检索消息。例如,将JMS消息发布到主题的消息生成器应该包括一个标题或名为targetUser的JMS属性,然后消费者可以说给出来自AddressChangeTopic的任何消息,其中自定义属性targetUser="Joe“(参见一些示例选择器示例这里 )。

关键是要认识到,您可以以查询数据库表的方式查询队列或主题,但查询语法非常有限。从概念的角度来看,我强烈推荐企业集成模式手册http://www.amazon.ca/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14207943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档