Ignite - 完全同步配置

时间:2018-05-24 13:46:27

标签: java ignite fault-tolerance

我在群集中有两个服务器点火节点(每个节点在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%概率保证此行为。

已更新

我运行测试并得到以下行为:

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

1 个答案:

答案 0 :(得分:4)

IgniteCache#invoke(...)是一项交易操作。学习它的最好方法是检查它是否抛出TransactionException。

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

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

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

&#34;交易调用&#34;将被打印在每个节点上,但是&#34; Atomic invoke&#34; - 只在一个人身上。