java - 点燃 - 完全同步配置
问题描述
我在集群中有两个服务器点火节点(每个节点都在 Spring Boot 应用程序中启动)。
我有两个缓存:
//持久化cahce
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% 的概率保证这种行为。
更新
我运行测试并得到以下行为:
每个请求总是在同一个节点上执行(调用方法)。我相信这是正确的行为。查询何时在第二个节点上执行?
解决方案
IgniteCache#invoke(...)是一个事务操作。学习它的最好方法是检查它是否抛出 TransactionException。
您的配置似乎足以保证节点之间的数据一致性。
如果您的意思是这两个缓存之间的一致性,那么您可以启动显式事务并在其中运行调用-s。
UPD
请注意,正如 JavaDoc 中针对invoke(..)方法所提到的,您的EntryProcessor应该是无状态的。它可能在不同的节点上被多次调用,因此每次都应该返回相同的值。
更新 2
如果您IgniteCache#invoke()
在事务缓存上调用方法,它会EntryProcessor
在每个节点上调用提供的方法,其中包含此缓存所需的分区。但是如果缓存是原子的,那么EntryProcessor
只会在主节点上调用。
但是你不应该依赖这种行为。它没有在任何地方指定,因此它可能会在未来的版本中更改。Ignite 可以免费进行尽可能多EntryProcessor#process()
的调用,以保证数据的一致性。
您可以使用以下代码来验证我的话:
public static void main(String[] args) throws IgniteException {
Ignite ignite = Ignition.start("examples/config/example-ignite.xml");
IgniteCache<Integer, String> atomicCache = ignite.getOrCreateCache(
cacheConfiguration("atomic", CacheAtomicityMode.ATOMIC));
IgniteCache<Integer, String> txCache = ignite.getOrCreateCache(
cacheConfiguration("transactional", CacheAtomicityMode.TRANSACTIONAL));
atomicCache.invoke(1, (entry, arguments) -> {
System.out.println("Atomic invoke");
return null;
});
txCache.invoke(1, (entry, arguments) -> {
System.out.println("Transactional invoke");
return null;
});
}
private static <K, V> CacheConfiguration<K, V> cacheConfiguration(String name, CacheAtomicityMode atomicity) {
CacheConfiguration<K, V> cacheCfg = new CacheConfiguration<>(name);
cacheCfg.setAtomicityMode(atomicity);
cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
return cacheCfg;
}
“事务调用”将打印在每个节点上,但“原子调用”——仅在一个节点上。
推荐阅读
- windows - 如何在批处理脚本中打印
- javascript - 使用 vuejs getItem 的 localforage
- mongoose - Mongoose Query Population 不适用于 mongoose v6.0.13
- javascript - 基本身份验证 ComparePassword
- c - 打印链表的字符串
- r - R blurjoin 循环遍历列表
- javascript - javascript getHours & getMinutes - myHours & myMinutes
- javascript - 如何重构返回值、函数和*组件*的自定义挂钩?
- c# - C# - 反序列化一个抽象类(指定的类型是抽象的:name='ValueColorConverter', namespace='', at
.) - latex - 更新 TexStudio 和 MikTex 后 memoir.cls 上的错误