如何在Java中的多个服务器之间保持数据结构同步?

时间:2010-06-17 19:48:13

标签: java

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

是否有可以执行此类操作的轻量级开源Java工具?我知道兵马俑,但它的重量相当于我的需要。

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

5 个答案:

答案 0 :(得分:3)

您可以使用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");
        })

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我怀疑你会发现比Terracotta更轻盈的东西。为什么不使用DB进行二级缓存?

答案 3 :(得分:1)

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

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

如果你心情愉快,你可以推出自己的解决方案,涉及JMS主题,听众和出版商,但这在实践中并不是非常简单。而且我不确定它是否会影响您正在寻找的性能。

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

答案 4 :(得分:1)

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