【问题标题】:How do I keep a datastructure in sync across several servers in Java?如何在 Java 中的多个服务器之间保持数据结构同步?
【发布时间】:2011-03-05 03:39:27
【问题描述】:

有一个包含我想在多个服务器之间保持同步的对象的地图,这样如果地图中的对象被创建、删除或修改 - 这会立即(即在一两秒内)反映在所有服务器上服务器,以一种可能扩展到数十台服务器的方式。

是否有一个轻量级的开源 Java 工具可以做这样的事情?我知道兵马俑,但它对我的需要来说相当重。

编辑:该地图由数据库(特别是 Apache Cassandra)支持 - 但我需要在几秒钟内通知我的客户对它的任何更改,这意味着我需要非常频繁地轮询 Cassandra,除非有通知客户地图已更改的其他方式。

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以使用Hazelcast。 如果您尝试共享同一张地图,Hazelcast 会自动为您执行此操作。 代码如下:

    java.util.Map<String, Customer> distributedMap = Hazelcast.getMap("customers");
    

    所有使用“客户”映射的 JVM 将看到完全相同的数据,即使它经常更新。如果您还想在 Map 更改时收到通知,那么您可以添加侦听器。方法如下:

    com.hazelcast.core.IMap<String, Customer> distributedMap = Hazelcast.getMap("customers");
    distributedMap.addEntryListener(new EntryListener() {
            public void entryAdded(EntryEvent entryEvent) {
                System.out.println("Entry added");
            }
    
            public void entryRemoved(EntryEvent entryEvent) {
                System.out.println("Entry removed");
            }
    
            public void entryUpdated(EntryEvent entryEvent) {
                System.out.println("Entry updated");
            }
    
            public void entryEvicted(EntryEvent entryEvent) {
                System.out.println("Entry evicted");
            })
    

    【讨论】:

      【解决方案2】:

      我认为Terracotta VM clustering 是要走的路。 (不知道“多服务器”与“轻量级”如何结合)

      【讨论】:

      • 正如我在问题中提到的,我知道 Terracotta,但我希望有更轻量级的东西。
      【解决方案3】:

      我怀疑你会找到比 Terracotta 更轻的东西。为什么不使用带有二级缓存的 DB?

      【讨论】:

      • 因为那样我需要非常频繁地轮询数据库。
      【解决方案4】:

      您必须更具体,例如,地图是由数据库支持的,还是只是在应用程序内存中(如在会话中或其他什么)?

      我已经看到通过 JMS 消息队列等(例如来自 apache 的 JCS)执行类似操作的缓存实现。

      如果您有心情,您可以推出自己的解决方案,包括 JMS 主题、侦听器和发布者,但这在实践中并不是很简单。而且我不确定它是否会产生您正在寻找的性能。

      正如其他海报所建议的那样,商业级集群/缓存解决方案可能是您的最佳解决方案。

      【讨论】:

      • 添加了一个段落来回答你的问题
      • 我见过(虽然不是很熟悉)用于此目的的分布式缓存。缓存的对象由数据库支持,并且有一些正常的刷新率(30 分钟等)。当一台服务器修改缓存数据时,本地缓存被刷新并重新加载。同时,向其他服务器发送一条消息,以再次从数据库中刷新它们的缓存对象。没有持续的轮询。看到这用于用户角色数据。它非常适合经常阅读但很少更新的内容。否则开销不值得。
      【解决方案5】:

      也许Hazelcast 可以提供帮助。它有一些分布式集合实现。

      【讨论】:

        猜你喜欢
        • 2015-06-19
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多