java - 关于Jms发布订阅者模型的建议

标签 java caching jms activemq publish-subscribe

我们有一个应用程序部署在多集群环境中的生产环境中,带有负载均衡器。

在应用程序中,我们保留缓存以提高性能。

问题在于,由于我们处于多集群环境中,单例并不是真正的单例,因此如果我们清除一个节点中的缓存,则不会通知另一个节点清理自己的缓存。

我们目前只有两个节点,但我们可以在未来添加更多。所以我的第一个想法是用模型发布/订阅者实现一个 JMS 队列。一旦一个节点需要清除他的缓存,它会向队列发送一条消息,所有的节点(甚至他自己)都应该被自动通知清除他们的缓存。我已经检查过 activemq,但据我所知,一旦发布者发送消息,订阅者就需要执行 getMessage() 来接收消息。这意味着我们应该不断地拉动队列以查看那里是否有任何消息,而且我还必须确保一旦所有订阅者都阅读了该消息,该消息就会被删除。

如果 activemq 或任何其他 jms 实现提供了满足我们需求的东西,我写这篇文章只是为了获得一些关于如何实现这样的建议。

谢谢

最佳答案

对于所有 JMS 提供程序(包括 ActiveMQ),此场景都非常简单。

只需向主题发布一条消息,比如 CLEAR.CACHE。然后让每个节点连接到该节点唯一的客户端 ID(即使在重新启动后也是相同的 ID,因此您需要从环境/配置中获取该 ID,而不是代码)。

然后每个节点都能够为 CLEAR.CACHE 主题创建持久订阅者。副本将被传送到每个节点 - 即使该节点在发布期间处于离线状态。

一些官方文档:https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

只是想说还有完整的分布式缓存解决方案可供使用,您不必手动处理这些东西。 Redis、hazlecast 等。但是,如果您想要的只是节点之间的基本“清除缓存”命令(或任何其他类型的在节点之间分发的命令),那么 JMS 是最佳选择。

关于java - 关于Jms发布订阅者模型的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41376028/

相关文章:

java - 无法从 JDK 6 下的 JMS 客户端连接到 WAS 6.0 队列

java - 如何编译maven包上的classpath资源?

java - JPA:在单个持久性单元上映射多个 Oracle 用户

java - Printf:Java 和 C 实现的差异

asp.net - ASP CSS 页面是否仍会像普通 CSS 页面一样被缓存?

java - 如何获得现有的 JMS 队列?

apache-camel - ActiveMQ 5.10.2 : [org. apache.activemq.broker.TransportConnection] TransportConnection(triggerStartAsyncNetworkBridgeCreation:无法添加连接

java - 用 Java 签署 PKCS10 证书

google-app-engine - 应用引擎 : Static Files Not Updating on Deploy

asp.net - 用于 ASP.NET 的缓存管理器应用程序