Apache.Ignite.Net CacheStoreFactory и CacheMode.Replicated не выполняет запись для всех узлов - PullRequest
0 голосов
/ 26 апреля 2018

Работая с C #, Apache Ignite 2.4 на Windows 10, я стремлюсь иметь несколько реплицируемых узлов с каждым собственным CacheStoreFactory.Мне нравится, когда CacheStoreFactory каждого узла вызывается при каждом изменении записи в кэше.Следующий пример кода приводит к выводу того, что я ожидал, поведения CacheMode.Partitioned.С CacheMode.Replicated я ожидаю две выходные строки (потому что работают два узла) для каждой операции cache.Put.Как мне этого добиться?

Вывод

Node count: 2
Started..
Write 0-0 by 63642613
Write 1-1 by 12036987
Write 2-2 by 63642613
Write 3-3 by 12036987
Write 4-4 by 63642613
Write 5-5 by 63642613
Write 6-6 by 12036987
Write 7-7 by 63642613
Write 8-8 by 12036987
Write 9-9 by 12036987
Finished count1:10 count2:10

Пример кода

class Program
{
    static void Main(string[] args)
    {
        var config = new IgniteConfiguration()
        {
            IgniteInstanceName = "A",
            CacheConfiguration = new List<CacheConfiguration>
            {
                new CacheConfiguration("mycache",new QueryEntity(typeof(int), typeof(int)))
                {
                    CacheMode = CacheMode.Replicated,
                    WriteThrough = true,
                    CacheStoreFactory = new StoreFactory(),
                },
            },
        };

        var ignite1 = Ignition.Start(config);
        config.IgniteInstanceName = "B";
        var ignite2 = Ignition.Start(config);

        Console.WriteLine("Node count: " + ignite1.GetCluster().GetNodes().Count);
        ignite1.GetCluster().SetActive(true);

        var mycache1 = ignite1.GetCache<int, int>("mycache");
        var mycache2 = ignite2.GetCache<int, int>("mycache");
        Console.WriteLine("Started..");
        for (int i = 0; i < 10; i++)
        {
            mycache1.Put(i, i);
        }
        Console.WriteLine($"Finished count1:{mycache1.Count()} count2:{mycache2.Count()}");
        Console.ReadLine();

        ignite1.Dispose();
        ignite2.Dispose();
    }

    private class StoreFactory : IFactory<ICacheStore>
    {
        public ICacheStore CreateInstance() { return new Store(); }
    }

    private class Store : CacheStoreAdapter<int, int>
    {
        public override void Delete(int key) { }

        public override int Load(int key) { return 1; }

        public override void Write(int key, int val)
        {
            Console.WriteLine($"Write {key}-{val} by {this.GetHashCode()}");
        }
    }
}

1 Ответ

0 голосов
/ 26 апреля 2018

Каждый ключ имеет свой собственный первичный узел, даже с реплицированным кешем, и только этот первичный узел будет записывать значение в хранилище. Ignite ожидает, что все узлы будут иметь один и тот же базовый CacheStore, и в этом случае имеет смысл записать значение в него только один раз, поскольку нет необходимости записывать его снова из резервной копии.

Если вы хотите распределить базовое хранилище, я рекомендую попробовать Ignite Native Persistence: https://apacheignite.readme.io/docs/distributed-persistent-store

...