Skip to main content
Version: 1.0.1

Using Continuous Queries

Sürekli sorgu(continuous query), bir cachete meydana gelen veri değişikliklerini izleyen bir sorgudur. Sürekli bir sorgu başlatıldıktan sonra, sorgu filtrenize giren tüm veri değişiklikleri size bildirilir.

Tüm güncelleme olayları, sorguda kaydedilmesi gereken local listener’a yayılır. Sürekli sorgu uygulaması, bir olayın local listener’a tam olarak bir kez teslim edilmesini garanti eder.

Güncellemeler için izlenen giriş aralığını daraltmak için bir remote filtre de belirleyebilirsiniz.

Local Listener

Bir cache güncellendiğinde (insert, update veya delete işlemlerinde), uygulamanızın buna göre tepki verebilmesi için sürekli sorgunun local listener’ıan bir event gönderilir. Local listener, sorguyu başlatan node’da yürütülür.

Sürekli sorgu, local listener olmadan başlatılırsa bir hata fırlatır.

  • ⌨️ .NET Sample
    class LocalListener : ICacheEntryEventListener<int, string>
    {
    public void OnEvent(IEnumerable<ICacheEntryEvent<int, string>> evts)
    {
    foreach (var cacheEntryEvent in evts)
    {
    //react to update events here
    }
    }
    }
    public static void ContinuousQueryListenerDemo()
    {
    var ignite = Ignition.Start(new IgniteConfiguration
    {
    DiscoverySpi = new TcpDiscoverySpi
    {
    LocalPort = 48500,
    LocalPortRange = 20,
    IpFinder = new TcpDiscoveryStaticIpFinder
    {
    Endpoints = new[]
    {
    "127.0.0.1:48500..48520"
    }
    }
    }
    });
    var cache = ignite.GetOrCreateCache<int, string>("myCache");

    var query = new ContinuousQuery<int, string>(new LocalListener());

    var handle = cache.QueryContinuous(query);

    cache.Put(1, "1");
    cache.Put(2, "2");
    }

Initial Query

Sürekli sorgu cluster’a kaydedilmeden önce ve siz güncellemeleri almaya başlamadan önce yürütülen bir başlangıç sorgusu belirleyebilirsiniz. Bir başlangıç sorgusu belirtmek için, ContinuousQuery.setInitialQuery(…) methodunu kullanın.

Tıpkı tarama sorgularında(scan queries) olduğu gibi, bir cursor döndüren query() methodu aracılığıyla sürekli bir sorgu yürütülür. İlk sorgu ayarlandığında, ilk sorgunun sonuçları üzerinde yineleme yapmak için bu imleci kullanabilirsiniz.

Remote Filter

Bu filtre, güncellenen her key için yürütülür ve güncellemenin sorgunun local listener’ına yayılmasının gerekip gerekmediğini değerlendirir. Filtre true döndürürse, local listener’a güncelleme hakkında bilgi verilir.

Fazlalık nedeniyle, filtre, key’in hem birincil hem de yedek sürümleri (yedekler yapılandırılmışsa) için yürütülür. Bu nedenle, güncelleme olayları için bir uzak dinleyici olarak bir uzak filtre kullanılabilir.

  • ⌨️ .NET Sample
    class LocalListener : ICacheEntryEventListener<int, string>
    {
    public void OnEvent(IEnumerable<ICacheEntryEvent<int, string>> evts)
    {
    foreach (var cacheEntryEvent in evts)
    {
    //react to update events here
    }
    }
    }
    class RemoteFilter : ICacheEntryEventFilter<int, string>
    {
    public bool Evaluate(ICacheEntryEvent<int, string> e)
    {
    if (e.Key == 1)
    {
    return false;
    }
    Console.WriteLine("the value for key {0} was updated from {1} to {2}", e.Key, e.OldValue, e.Value);
    return true;
    }
    }
    public static void ContinuousQueryFilterDemo()
    {
    var ignite = Ignition.Start(new IgniteConfiguration
    {
    DiscoverySpi = new TcpDiscoverySpi
    {
    LocalPort = 48500,
    LocalPortRange = 20,
    IpFinder = new TcpDiscoveryStaticIpFinder
    {
    Endpoints = new[]
    {
    "127.0.0.1:48500..48520"
    }
    }
    }
    });
    var cache = ignite.GetOrCreateCache<int, string>("myCache");

    var query = new ContinuousQuery<int, string>(new LocalListener(), new RemoteFilter());

    var handle = cache.QueryContinuous(query);

    cache.Put(1, "1");
    cache.Put(2, "2");
    }

Events Delivery Guarantees

Sürekli sorgular, eventlerin clientların local listenerlarına teslimi için tam olarak bir kez semantik sağlar.

Hem birincil hem de yedek düğümler, sunucu tarafında sürekli sorgular tarafından işlenen ancak henüz clientlara teslim edilmeyen eventleri tutan bir güncelleme kuyruğu tutar. Bir birincil node’un herhangi bir nedenle çöktüğünü veya cluster topolojisinin değiştiğini varsayalım. Bu durumda, her yedekleme node’u, güncelleme kuyruğunun içeriğini client’a aktarır ve her eventin client’ın local listener’ına iletildiğinden emin olur.

Ignite, yinelenen bildirimleri önlemeye yardımcı olan bölüm başına özel bir güncelleme sayacını yönetir. Bir bölümdeki bir giriş güncellendiğinde, bu bölüm için bir sayaç hem birincil hem de yedek node’larda artırılır. Bu sayacın değeri de client’a event bildirimi ile birlikte gönderilir. Böylece, client zaten işlenmiş olayları atlayabilir. Client bir eventin alındığını onayladığında, birincil ve yedek nodelar bu eventin kaydını yedek kuyruklarından kaldırır.

Daha fazla bilgi için…