gpt4 book ai didi

java - Ignite - 完全同步配置

转载 作者:行者123 更新时间:2023-12-01 17:50:43 25 4
gpt4 key购买 nike

我的集群中有两个服务器 ignite 节点(每个节点都在 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。

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

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

UPD

请注意,正如 JavaDoc 中所述 invoke(..)方法,你的EntryProcessor应该是无国籍的。它可能在不同的节点上被多次调用,因此每次都应该返回相同的值。

UPD 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;
}

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

关于java - Ignite - 完全同步配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50510989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com