Merhaba arkadaşlar bu yazımda Hazelcast nedir kısaca bahsedip nasıl kullanılır kısa bir örnek ile açıklayacağım.
Hazelcast Nedir ?
Hazelcast in-memory datagrid olarakta ifade edilmektedir.Birden fazla makine üzerinde çalışan uygulamaların birbirleriyle kolay bir şekilde haberleşmesi sağlayan ve bellekte çalışan bir yapıdır.
Hazelcast içerisinde Queue , Map , List , Set gibi yapılarda dağıtık bir halde çalışabilir ve farklı birden fazla instance arasında paylaşımlı olarak kullanılabilir.
Kısa bir örnekle açıklayalım.X ve Y isimli iki farklı uygulamamız olduğunu düşünelim.X uygulaması içerisinde uygulamanın bulunduğu sunucunun ram, cpu kullanımı gibi bilgilerin var olduğunu düşünelim.Bu bilgiler 3 saniyede bir Y uygulamamıza göndererek Y uygulaması içerisinde bu değerleri ekrana bastığımız dashboard ekranı olduğunu düşünelim.3 saniyede basılan bu verileri database kullanarak bir tabloyu doldurabiliriz.Fakat bu yöntem bize veritabanında select, insert gibi komutları 3 saniyede bir çalıştırmamız gerektiği anlamına geliyor.Bu bize performans açısından büyük bir problem oluşturacaktır.
Hazelcast tamda bu noktada devreye giriyor.Bize memory’de bir yer ayırarak bu verileri herhangi bir veritabanına yazmadan memory’de tutabilme imkanı sağlıyor.İçerisinde Map , Queue , Set , Topic gibi bileşenler yer alıyor.İhtiyaç duyduğumuz senaryoya göre bunları kullanabiliriz.
Yukarıda oluşturduğumuz senaryoda ihtiyacımızı topic yapısı tam anlamıyla karşılıyor.Çünkü topic yapısında belirlediğimiz topic üzerinden listener tanımı yapabiliyoruz.X uygulamamız “/dashboard” isimli topic içerisine verileri 3 saniyede bir gönderiyor. Y uygulamamız ise bu topic üzerinde bir listener tanımı yapıyor.X uygulaması topic üzerine her bir veri gönderdiğinde Y uygulaması onu anlık olarak verilere erişmiş oluyor.
Örnek Uygulama
Yukarıda oluşturduğumuz senaryo için Spring boot projesi oluşturarak uygulamamızı geliştirmeye başlayalım.Spring boot template projeye github üzerinden erişebilir bundan sonraki kısımları bu projeye eklemeler yaparak devam edebilirsiniz.
Pom.xml dosyamız içerisine gerekli olan bağımlılıklarımızı ekleyelim.
[code lang=”html”]
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-client</artifactId>
</dependency>
[/code]
com.enesbyc.hazelcast.model paketimizin altında model sınıfımızı oluşturalım.
[code lang=”java”] public class SystemStats implements Serializable{ private int cpu; private int memory; public SystemStats(int cpu, int memory) { super(); this.cpu = cpu; this.memory = memory; } public int getCpu() { return cpu; } public void setCpu(int cpu) { this.cpu = cpu; } public int getMemory() { return memory; } public void setMemory(int memory) { this.memory = memory; } @Override public String toString() { return "SystemStats [cpu=" + cpu + ", memory=" + memory + "]"; } } [/code]
Hazelcast topic içerisine herhangi bir mesaj eklendiğinde bizim uygulamamızın haberdar olması için listener tanımı yapalım. com.enesbyc.hazelcast.listener paketi altında listener sınıfımızı oluşturalım.Oluşturduğumuz listener sınıfımızı topic oluşturduktan sonra kullanacağımızı bir sonraki adımda belirteceğiz.
[code lang=”java”] public class HazelcastListener implements MessageListener<SystemStats>{ @Override public void onMessage(Message<SystemStats> message) { SystemStats systemStats = message.getMessageObject(); System.out.println("Message received from hazelcast. " + systemStats); } } [/code]
Uygulamamızın hazelcast ile bağlamak için @Configuration anotasyonu ile bir sınıf oluşturalım.Sınıfımızın üzerine bu anotasyonu eklediğimizde uygulama ayağa kalkarken sadece bir kere oluşturulacağını belirtiyoruz.Bu adımda hazelcast bir kere initialize ediliyor ve listener tanımını yapıyoruz. com.enesbyc.hazelcast.init paketi içerisinde sınıfımızı oluşturalım.
[code lang=”java”] @Configuration public class HazelcastInitializer { public HazelcastInitializer() { HazelcastListener hzListener=new HazelcastListener(); Config cfg = new Config(); HazelcastInstance hz = Hazelcast.newHazelcastInstance(cfg); //Get dashboard topic ITopic topic = hz.getTopic ("dashboard"); //Initiliaze listener to dashboard topic topic.addMessageListener(hzListener); System.out.println("Hazelcast initialized successfully."); } } [/code]
Şimdiye kadar hazelcast bağlantısı ve topic dinleme işlemlerini yaptık.Bu adımda ise oluşturduğumuz topic içerisine veri göndereceğiz.Oluşturduğumuz senaryoda bize farklı bir uygulamadan veri geleceği için bunu farklı bir projede oluşturmamız gerekiyordu.Şuan aynı proje içerisinde oluşturucağım. com.enesbyc.hazelcast.broadcaster paketi altında bize 3 saniyede bir çalışacak ve topic içerisine veri gönderecek sınıfımızı ekleyelim.Bu sınıf içerisinde spring anotasyonları ile Scheculed task oluşturacağız.Bu sayede 3 saniyede bir topic içerisine gönderim yapacağız.
[code lang=”java”] @Configuration @EnableAsync @EnableScheduling public class HazelcastBroadcaster { private HazelcastInstance hz = Hazelcast.newHazelcastInstance(); @Async @Scheduled(fixedRate = 1000) public void scheduleFixedRateTaskAsync() throws InterruptedException { //Get dashboard topic ITopic topic = hz.getTopic ("dashboard"); //Generate dummy data SystemStats stats=new SystemStats(1200, 3500); //Publish generated data to topic topic.publish(stats); System.out.println("Message sent successfully to dashboard topic. " + stats); Thread.sleep(3000); } } [/code]
Uygulamamızı çalıştırdığımızda belirlenen topic içerisine verilerimizi 3 gönderip daha sonra listener yardımı ile bu verilere ulaştığımızı console üzerinden kontrol edebiliriz.
Proje dosyasına bu github üzerinden erişebilirsiniz.Bir sonraki yazımda görüşmek üzere…