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 - Java程序无法编译: missing return statement

java - 给定查询之间的性能差异?

hadoop - 本地缓存后映射减少占用空间的作业

c# - 为 MemoryCache(或任何缓存)实现通用 Get<T>

java - 如何捕获 JMS 连接建立的时间?

java - Clojure中如何向静态方法传入参数?

java - JSOUP 无法在 Android Studio 中提取动态生成的 DOM 内容

windows - 动态调整缓存以适应可用内存

java - Spring 集成: send object in json to jms

java - 如何使用 Spring JMS 监听 JMS 主题