Görkem Acısu
6 min readMay 16, 2020

--

Spring Boot ile Hazelcast Distributed Cache Kullanımı

Herkese merhabalar konu başlığından da anlaşılacağı üzere spring boot ile hazelcast distributed cache kullanımını öğreneceğiz.

Oluşturucağımız örneğe geçmeden önce distributed cacheden bahsedip daha sonra hazelcast kullanarak distributed cache kullanım örneğini yapıcağız.

Distributed(Dağıtılmış) Cache Nedir ?

Birden fazla sunucu üzerinde çalıştırdığımız uygulamamızın cachelerinin birbirleriyle iletişim kurmasını sağlayan cache mekanizmasıdır. Yani a sunucusunda tuttuğum cache bilgisini aynı zamanda b sunucusunda da tutmam gerekebilir veya b sunucusunda sildiğim bilgiyi a sunucusundan da silmem gerekebilir böyle durumlarda distributed cache kullanmamız uygundur.

Spring Boot ile Hazelcast Distributed Cache Kullanımı

Spring boot projesi oluşturmak için https://start.spring.io/ sitesini ziyaret edebilirsiniz ben oluşturduğum projenin pom.xml çıktısını aşağıda paylaşıyorum.

Pom.xml

Hazelcast Configuration

Hazelcast configuration dosyasını paylaşmadan önce yapıcağım örnek 3 sunuculu bir örnek olucak eğer hazelcast distributed cache minimum kaç sunucu istiyor diye soracak olursanız sağlıklı bir şekilde çalışmak için en az 3 sunucu istemektedir daha fazla detay için paylaşıcağım link üzerinden bakabilirsiniz. https://hazelcast.com/blog/cluster-quorum/

HazelcastConfiguration.java

Yukarıda paylaştığım config dosyasının içindeki özelliklerden bahsetmek istiyorum.

Hazelcast Management Center Nedir ?

Hazelcast yönetim merkezidir. Bu yönetim merkezinde çalıştıran düğümlerin izlenmesini ve yönetilmesini sağlar. Bu, kümelerin genel durumunu izlemenin yanı sıra, gerçek zamanlı olarak veri yapılarının ayrıntılı analizini ve taramasını, harita yapılandırmalarını güncellemeyi ve düğümlerden iplik dökümlerini almayı içerir.

Hazelcast Management Center Kurulumu

Kurulum için https://hazelcast.org/imdg/download/ adresini ziyaret edip projenizde kullanıcağınız sürüme göre indirme yapmanız önemlidir bu proje özelinde 3.12.7 sürümünü kullanıcaz. İndirdikten sonra zip dosyasını çıkartıp klasörü açtığımızda aşağıdaki gibi klasör yapısı gelecektir.

Bu dosyada gördüğünüz management center klasörüne tıklayıp onun içindeyken cmd ‘yi açıyoruz ve windows için start.bat komutunu çalıştırıyoruz sonrasında hazelcasti http://localhost:8080/hazelcast-mancenter default olarak bu adreste başlatıyor, isterseniz portunu değiştirebilirsiniz.

Management center başladığında tarayıcıya http://localhost:8080/hazelcast-mancenter yazarsanız aşağıdaki gibi ekran gelicektir bu ekranda kendi belirlediğiniz kullanıcı adı ve şifre ile devam edebilirsiniz.

Management Center kurulumunu yaptığımıza göre HazelcastConfiguration sınıfımızdaki config propertylerinden bahsedebiliriz.

Hazelcast Management Center Config

config.getManagementCenterConfig().setEnabled(true);
config.getManagementCenterConfig().setUrl("http://localhost:8080/hazelcast-mancenter");

Yukarıda kurulumunu yaptığımız management center için yukarıdaki config özelliklerini verirsek hazelcast otomatik olarak buraya bağlantıyı sağlayacaktır. Burda dikkat edilmesi gereken nokta setEnabled özelliği false ise bağlantı yapmayacaktır veya url’i yanlış verirseniz de yapmıyacaktır bir diğer önemli husus management center versiyonlarına göre url’ler değişebiliyor örnek 4.0.1 versionunda direkt localhost:8080 üzerinde başlamaktadır ama 3.12.7 de localhost:8080/hazelcast-mancenter üzerinde başlamaktadır.

NOT : Son olarak spring boot versiyonunuza göre hazelcast ‘i kullanınız çünkü spring boot versionunuz eski ise o sürüme uyumlu olan hazelcast management centerı arayacaktır. Örnek olarak 1.5.6 spring boot versiyonunda 4.0.1 hazelcast versiyonunu kullanırsınız fakat management center olarak 3.7.8 arıyor ve bağlantıyı kuramıyor.

Hazelcast Instance Adı Belirleme ve Map Config

config.setInstanceName("hazelcast-instance")
.addMapConfig(
new MapConfig()
.setName("hazelcastMap")
.setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
.setEvictionPolicy(EvictionPolicy.LRU)
.setTimeToLiveSeconds(-1));

Yukarıdaki config özelliklerinden kısaca bahsedelim ;

config.setInstanceName = Bağlantı sağlıcak sunucularınızın isimlerini vermek isterseniz bu özelliği kullanabilirsiniz.

addMapConfig = Cachedeki verilerimi map şeklinde tutucağım için map config özelliğini belirtiyorum eğer farklı bir şekilde tutmak istersem ona göre config yapmam gerekebilir diğer veri türleri için aşağıdaki adrese bakıp ileyebilirsiniz. https://docs.hazelcast.org/docs/3.12.7/manual/html-single/index.html#distributed-data-structures.

setName = Tutucağım mapin ismini belirler.

setMaxSizeConfig = Tutucağım verinin giriş sayısını ve maxsize politikasına göre boyutunu belirtir. MaxSizePolicy konusu biraz farklı olduğu için onu ayrıca araştırmanızda fayda var.

setEvictionPolicy = Tahliye politikası diye adlandırdığımız politikanın amacı bellek dolduğunda nasıl silmeye başlayağını belirtebilirsiniz. Bizim kullandığımız EvictionPolicy.LRU eklenme sırasına göre bellek dolduğunda ilk ekleneni çıkarıcak şekilde ayarlanmıştır.

setTimeToLiveSeconds = Bu özelliğin amacı ise map’e eklediğimiz verilerin saniyesini belirler ve o saniye dolduğunda o veriyi siler eğer 0 dan küçük verirseniz sonsuz anlamına gelmektedir eğer 0 dan yukarı verirseniz mesela 180 saniye verdiğinizi varsayalım saniye dolduğu anda mapden ve cacheden siler.

Hazelcast Network Config

NetworkConfig network = config.getNetworkConfig();
network.setPortCount(3);
JoinConfig join = network.getJoin();
join.getMulticastConfig().setEnabled(false);
join.getTcpIpConfig().addMember("127.0.0.1").addMember("127.0.0.1").addMember("127.0.0.1").setEnabled(true);
network.getInterfaces().setEnabled(true).addInterface("127.0.0.1").addInterface("127.0.0.1").addInterface("127.0.0.1");

Network config özelliklerinden kısaca bahsedelim ;

network.setPortCount = Uygulamamız başladığı zaman kaç tane port açabilceğini belirleyebiliriz. Default port sayısı normalde 100'dür ama bizim o kadar port açmamıza ihtiyaç yok , hazelcast default portumuz 5701' dir bunu da değiştirebiliriz. Verdiğimiz örnekte 3 tane port açabilir 4.cüyü açmak istediğinde tekrar 5701 portunu deniyeceği için hata alıcaktır.

join.getMulticasting().setEnabled = Çok noktaya yayın otomatik bulma mekanizması ile Hazelcast, küme üyelerinin çok noktaya yayın iletişimini kullanarak birbirlerini bulmalarını sağlar. Biz bunu kullanmıyacağız çünkü sunucularımızı tcpIp ile kesfediceğimiz için enabled özelliğini false olarak verdik.

join.getTcpIpConfig().addMember =Sunucu iplerimizi belirttiğimiz özellik bu ipler arasında bağlantı noktaları oluşturur ve dinleme yapar. Aşağıdaki resimde bir tane başlayan uygulamamızın bağlantı oluşturduğu server logu gözükmektedir.

Birinci uygulama başladığında
İkinci uygulama Başladığında
Üçüncü uygulama başladığında

join.getTcpIpConfig().setEnabled = Bu özellik tcpIp joinlemesi yapılsın mı yapılmasın mı sorusu biz yapılsın istediğimiz için true verdik.

network.getInterfaces().addInterface = Bu özelliğin amacı ise kullandığımız iplerin doğruluğunu kontrol eder eğer yanlış varsa uygulama başlamaz.

network.getInterfaces().setEnabled = Bu özellik ise interface özelliğinin etkinleştirilip etkinleştirilmediğini kontrol eder.

HazelcastController.java

Yukarıda konfigurasyon özelliklerinden bahsettikten sonra şimdi cachedeki verilerimizi nasıl yönetiriz basit bir şekilde bir controller oluşturup postman üzerinden istek atıcam.

Yukarıdaki HazelcastController sınıfımız içindeki terimlerden kısaca bahsedeyim.

HazelcastInstance = Hazelcast örneğidir. Her örnek, bir Hazelcast kümesindeki üye ve / veya istemcidir. Hazelcast’in dağıtılmış veri yapılarını kullanmak istediğinizde, önce bir örnek oluşturmanız gerekir. Tek bir JVM’de birden fazla Hazelcast örneği oluşturulabilir.

hazelcastInstance.getMap = Belirtilen ada sahip harita örneğini oluşturur veya döndürür.

Yukarıdaki örnekte put , get ve remove örneklerini işlicez bunları işlemeden önce projemizde bir tane jar oluşturmamız gerekiyor ve bu jarı 3 farklı portta çalıştırıp postmanden istek atıcaz.

Bu proje özelinde jar oluşturmak için mvn clean install komutunu kullanıyorum ve proje için de target klasörümde oluşmuş oluyor.

Bu jarı çalıştırmak için cmd’ yi açıp java -jar hazelcast-distributed-cache-0.0.1-SNAPSHOT.jar komutunu çalıştırıyoruz ve ilk uygulamamız başlamış oluyor ikinci ve üçüncü uygulamaları çalıştırmak için java -jar hazelcast-distributed-cache-0.0.1-SNAPSHOT.jar sonlarına — server.port=8082 & ve — server.port=8083 & komutlarını ekleyip çalıştırıcaz.

Jarlarımız çalıştığına göre postman üzerinden istek atabiliriz. İlk isteğimizi ilk çalıştırdığımız uygulama üzerinden atıyoruz.

8081 portumuz üzerinden mapimize ilk örneği eklemiş olduk.

Bu eklediğimiz map’i hazelcast management center üzerinden de görebiliriz. Yukarıda bahsettiğim şekilde kurulumunu yaptıktan sonra tarayıcıya http://localhost:8080/hazelcast-mancenter yazdığımızda aşağıdaki ekrana erişebiliriz.

Gördüğünüz üzere hazelcastMap içinde bir girişimiz bulunmaktadır.

Şimdi http://localhost:8082/hazelcast?key=1 sorgumuzu çalıştırdığımızda cevap dönerse olmuş demektir.

Yukarıdaki resimde gördüğünüz gibi cevabı dönmüş.

Şimdi http://localhost:8083/hazelcast?key=1 sorgumuzu çalıştırıyoruz.

Yukarıdaki resimde gördüğünüz üzere map’in içindeki veriyi sildik bakalım hazelcast management center üzerinden de silindiğini görebilcekmiyiz.

Hazelcast management center üzerinden de silinmiş olarak gözüküyor demekki uygulamamız sorunsuz çalışıyor.Hazelcast Management Center opensource olarak kullandığımızda sürüme göre 2 veya 3 tane sunucuyu yönetmemize imkan verir bunları aştığımızda hazelcast management ekranında hata vericektir.

Uygulamanın tamamını bu adresten indirebilirsiniz , https://github.com/grkmacs/hazelcast-distributed-cache/

Anlatıcaklarım bu kadar umarım yararlı bir anlatım olmuştur bir sonraki yazımda görüşmek üzere…

--

--