Java Ignite-完全同步配置

Java Ignite-完全同步配置,java,ignite,fault-tolerance,Java,Ignite,Fault Tolerance,集群中有两个服务器ignite节点(每个节点在Spring引导应用程序中启动) 我有两个缓存: //持久性钙 configuration.setReadThrough(true); configuration.setWriteThrough(true); configuration.setCacheStoreFactory(storeFactory); configuration.setAtomicityMode(CacheAtomicityMode.TRANSACTIO

集群中有两个服务器ignite节点(每个节点在Spring引导应用程序中启动)

我有两个缓存:

//持久性钙

configuration.setReadThrough(true);
    configuration.setWriteThrough(true);
    configuration.setCacheStoreFactory(storeFactory);
    configuration.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
    configuration.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
    configuration.setCacheMode(CacheMode.REPLICATED);
//记忆中

configuration.setIndexedTypes(String.class, SequenceReserve.class);
    configuration.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
    configuration.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
    configuration.setCacheMode(CacheMode.REPLICATED);
对任何缓存的更新请求可以并行地发送到每个节点

每次更新-原子操作

cache.invoke(...);
我的主要目标是不惜任何代价避免数据不一致。内存缓存可能丢失,但不应不一致

如果事务未在所有节点上提交,则任何节点都应返回异常

我是否可以编写这样的配置,以100%的概率保证这种行为

已更新

我运行了测试,得到了以下行为:

每个请求总是在同一个节点上执行(invoke方法)。我相信这是正确的行为。何时在第二个节点上执行查询?

是事务性操作。学习它的最好方法是检查它是否抛出TransactionException

您的配置似乎足以保证节点之间的数据一致性

如果您的意思是这两个缓存之间的一致性,那么您可以启动显式事务并在其中运行-s

UPD

注意,正如javadocformethod中提到的,您的方法应该是无状态的。它可能在不同的节点上被多次调用,因此每次都应该返回相同的值

UPD 2

如果在事务性缓存上调用
IgniteCache#invoke()
方法,则会在包含此缓存所需分区的每个节点上调用提供的
EntryProcessor
。但是如果缓存是原子的,那么只会在主节点上调用
EntryProcessor

但你不应该依赖这种行为。它没有在任何地方指定,因此在将来的版本中可能会更改。Ignite可以自由调用
EntryProcessor#process()
,以保证数据一致性

您可以使用以下代码验证我的话:

publicstaticvoidmain(字符串[]args)引发异常{
Ignite Ignite=Ignition.start(“examples/config/example Ignite.xml”);
IgniteCache atomicCache=ignite.getOrCreateCache(
cacheConfiguration(“atomic”,CacheAtomicityMode.atomic));
IgniteCache txCache=ignite.getOrCreateCache(
cacheConfiguration(“transactional”,CacheAtomicityMode.transactional));
atomicCache.invoke(1,(条目,参数)->{
System.out.println(“原子调用”);
返回null;
});
调用(1,(条目,参数)->{
System.out.println(“事务调用”);
返回null;
});
}
专用静态CacheConfiguration CacheConfiguration(字符串名称、CacheAtomicityMode原子性){
CacheConfiguration cacheCfg=新的CacheConfiguration(名称);
cacheCfg.setAtomicityMode(原子性);
cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
返回cacheCfg;
}
“事务调用”将打印在每个节点上,但“原子调用”仅打印在单个节点上。

是一种事务操作。学习它的最好方法是检查它是否抛出TransactionException

您的配置似乎足以保证节点之间的数据一致性

如果您的意思是这两个缓存之间的一致性,那么您可以启动显式事务并在其中运行-s

UPD

注意,正如javadocformethod中提到的,您的方法应该是无状态的。它可能在不同的节点上被多次调用,因此每次都应该返回相同的值

UPD 2

如果在事务性缓存上调用
IgniteCache#invoke()
方法,则会在包含此缓存所需分区的每个节点上调用提供的
EntryProcessor
。但是如果缓存是原子的,那么只会在主节点上调用
EntryProcessor

但你不应该依赖这种行为。它没有在任何地方指定,因此在将来的版本中可能会更改。Ignite可以自由调用
EntryProcessor#process()
,以保证数据一致性

您可以使用以下代码验证我的话:

publicstaticvoidmain(字符串[]args)引发异常{
Ignite Ignite=Ignition.start(“examples/config/example Ignite.xml”);
IgniteCache atomicCache=ignite.getOrCreateCache(
cacheConfiguration(“atomic”,CacheAtomicityMode.atomic));
IgniteCache txCache=ignite.getOrCreateCache(
cacheConfiguration(“transactional”,CacheAtomicityMode.transactional));
atomicCache.invoke(1,(条目,参数)->{
System.out.println(“原子调用”);
返回null;
});
调用(1,(条目,参数)->{
System.out.println(“事务调用”);
返回null;
});
}
专用静态CacheConfiguration CacheConfiguration(字符串名称、CacheAtomicityMode原子性){
CacheConfiguration cacheCfg=新的CacheConfiguration(名称);
cacheCfg.setAtomicityMode(原子性);
cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
返回cacheCfg;
}

“事务调用”将打印在每个节点上,但“原子调用”仅打印在单个节点上。

是的,我指的是一个缓存节点之间的一致性是的,我指的是一个缓存节点之间的一致性