有一个Map,其中包含我希望在多个服务器之间保持同步的对象,这样,如果地图中的对象被创建,删除或修改 - 这会立即反映出来(即在一两秒内)服务器,可以扩展到数十台服务器。
是否有可以执行此类操作的轻量级开源Java工具?我知道兵马俑,但它的重量相当于我的需要。
编辑:地图由数据库(特别是Apache Cassandra)支持 - 但我需要在几秒钟内通知我的客户任何更改,这意味着我需要经常轮询Cassandra,除非有一些其他方法通知客户地图已更改。
答案 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可以提供帮助。它有一些分布式集合实现。