Java 中的分布式缓存使用 ehcache RMI



要求:我有4台服务器:A,B,C,D。它们都连接到数据提供者,获取数据并将其保存到mongodb中N分钟。因此,如果下次相同的请求到达另一台服务器,它只会从mongodb获取数据,而不是调用数据提供者。

|A|
|B|    |data provider|
|C|
|D|

但是,如果 |data provider| 响应缓慢,则有可能对同一资源的 2 个不同请求到达 A、B。我希望一个请求等待,直到收到第一个请求的响应。我为此使用队列,这对于单个服务器来说很好。但是现在由于多台服务器,我需要分布式缓存。

实现:在网上阅读了几篇文章后,我了解到Java中的分布式缓存可以使用ehcache RMI复制来实现。但是在继续ehchache之前,我几乎没有疑问。(虽然有更多的解决方案,如JCS等,但我决定根据StackOverflow上的其他答案选择ehcache(

怀疑

  • 如果其中一台服务器出现故障怎么办?ehcache 会自动处理这个问题吗?

有趣的情况,但我也没有看到额外的缓存(任何类型的(如何帮助解决问题。最终,您的问题归结为服务器之间的协调问题,缓存几乎没有什么可添加的。

相反,我会使用在四个服务器之间共享的队列,其中一次只允许一个资源请求。另一种可能性是共享 Map,其中每个服务器将在检索资源名称时锁定资源名称。然后,其他服务器可以等待此锁,一旦释放,请尝试从MongoDB检索资源。

我还没有尝试过使用它,但是redis和redisson的组合看起来非常适合这样的任务。

具有 RMI 复制的 Ehcache 不是分布式缓存,在您的情况下不会有所帮助,因为没有任何共享状态可以排队/隔离您的访问。

分布式Ehcache(由Terracotta支持(可以提供帮助,因为您可以将强一致性与CacheLoader相结合,以获得跨服务器只有一个线程加载给定资源。但除非你准备好坚持使用Terracotta 3.7.x,否则这不再是一个开源选项。

但正如Martin所说,这可能不是您的用例的最佳答案,因为我觉得您已经使用MongoDB作为快速访问存储,这使得缓存变得多余。

最新更新