Menu

// Freelance Developer

Works & Projects

What I have done with Apache Kafka

apache kafka

 

 

Think that your applications need to process thousands of data simultaneously on SQL server to prepare and send them to another application domain.

And also think that your application works with more than 30 threads and 5 or more instances on one server.

So that means, your database operations are getting worse because of multiple access to tables, your indexes will be fragmented and so on.

We have solved this kind of performance issue with message queuing methods.

Concept

 

Message queuing is an old concept to send and receive data from a layer to another layer with almost no cost. There are two main points of queuing; Producer and Consumer.

What we have found !

 

After a little research we came up with lots of different message queue systems like MMSQ, Apache Kafka, Rabbit MQ and so on.

While deciding about what we need to choose, we compared their performance analysis, read some papers about them and searched for best practices.

We have decided on Apache Kafka.

What we have done !

 

First, we figured out, how could we integrate queuing structure to our application domain. We separated our applications as Producers and Consumers. We refactored our application code and we tried to implement Producer logic to domain.

Then, we have tried to implement Consumer logic to our code.

We have installed Kafka 0.11.x to our three Centos distribution as cluster. While installing Kafka we only followed instructions of documentation.

Kafka has a pool terminology which means, producers were going to send messages to those pools and consumers were going to listen those pools. After installation we have configured eight different pools with 32 partitions.

Perfomance

 

After we have started sending and receiving our data over message queue, our database operations and cpu usage decreased. Applications started to process data to with no loss of latency or database access.

It has been seven months and we have no problem about processing data or server issues, or JVM crash. Our applications are stable and we had no restart until now.

But it has recommended that JVM should be monitored, because in some time, it can cause trouble on cluster environment.

 

 

Power Tools : IoC Containers

ioc containers

So here we are.

As a developer, when i started to write code, it did not matter for me to have a clean code or a structure, patterns etc… to use. Programming was  like, learning and practicing a new language for me. So after a while, as gaining some experience on programming, I started to build my apps  using n-tier layers. You know, firstly you start to separate layers, as business logic, data access layers, and also if you want to use some aspect oriented features, as your projects grows, it becomes hard to control.

An application cycle, it all begins with a entry point. For example, in .Net a console application starts with Main function in Program.cs or  in C++ it has a Main function. So, you need to call your related component (class) inside this function to start your business logic. In a monolithic applications all components are tightly coupled. Tightly coupled means, a component must have another component to use. That means, as a developer, if you change a component, you need to change all depended points on application.

In large scale apps, it will be hard to change all dependencies by hand. So, guess what ? We have a dependency injection pattern for us to bind components as loosely coupled. So, if we change any component, we will only change the component it self.

Inversion of Control

Inversion of control is a theory of controlling all components on one hand. As developer, you are suppose to build only one component to rule them all. So you can accomplish inversion of control in your application.

You can apply IoC, by using IoC containers. Those containers are helping developer to link their components with each other, helps to decide life-cycle of a them as Singleton, Transient, per thread etc… Also some containers has features to provide self hosting services, supporting logging components like Nlog, Log4net…

There are lots of containers out there like Autofac, Castle Windsor, Unity. I’ve started to use container with Castle Windsor because it was easy to learn for me. I began with building  one component only to register other components in my application.

Basically containers has two main operations which are registering and resolving components. Registering means, you add your component into container with some definitions like life-cycle. Resolving means, you call your component from container and execute related function.

Containers are able to control all relations between components by resolving from their dependencies.

Interfaces

To use this kind of structure, you need to use some basic object-oriented feature like abstraction. Abstraction will help to apply loosely coupling between components. So using an interface will be a good choice to bind components by dependency injection.

Final

As a result, this technique helps developer to build their applications in a proper (standard) way. Learning to apply IoC could be complicated at first but in time as you learn, you will understand the necessity of it.

Graylog Serüveni

graylog serüveni

Verinin olduğu ve üretilmeye başlandığı her platformda uygulamaların performansı, davranışları, üretilen verinin izlenmesi gibi belli başlı konular oluşur. Bu yazıda veri takibinin kolaylıkla yapılabilmesine olanak sağlayan Graylog üzerine deneyimlerimi paylaşmaya çalışacağım.

Her uygulama geliştirici, mutlak olarak yazdığı uygulamanın davranışlarını, veri akışını, performans değerlerini kaydetmek ve bunları yönetmek ister. Aksi halde, yapılan işin takibi zorlaşır.

Mevcut sisteme katılan her uygulamanın kendisine özgü log üretme yapısı bulunur; ki bunlar dosya, veri tabanı vb. formatlarda oluşabilir.

Kapsam büyüdükçe uygulamadan gelen hataları takip etmek, bunları ilgili kaynaktan okuyup bir analiz yapmak, teşhisi doğru koymak ise başka bir efor gerektirir. Merkezi yönetimi olmayan bu tip durumlarda, her uygulamanın log aldığı kaynağa gidilip, yüksek boyutlu dosyalar, ya da kayıtlar ayrı ayrı incelenmeye başlanır.

Çalıştığım yerlerde karşılaştığım zorlukların ortak noktalarından biri uygulamaların ve dolayısı ile oluşturulan sistemin loglanmasına yönelik çalışmaların tek elden alınmaması, analizi yapan kişinin aynı işi sürekli aynı adımlarla tekrar etmesidir.

Kayıtların belli bir merkezden yönetimi, bunların ortak noktada toplanması ve bir arayüz üzerinden filtreleme, arama, eş zamanlı izlenmesine yönelik oldukça yöntem bulunmaktadır. Bunlardan birkaçını; Logstash, GrayLog, rsyslog olarak gösterebiliriz.

Çalıştığım yerde Graylog üzerine testlerimizi yapıyoruz. Graylog kurulumu basit, dökümanı iyi organize edilmiş, anlaşılır, kendi içinde hem rest api, hem de web arayüzü bulunduran bir uygulama.

Graylog, içinde barındırdığı web uygulaması için MongoDb, gelen kayıtların indexlenmesi ve arama altyapısı olarak ise Elasticsearch kullanıyor.

Dökümantasyonunda bulunan yükleme adımları tamamlandığında, artık uygulamalarınızdan kayıt yollamaya hazır bir şekilde beklemektedir. Kayıt alabilmek için, web arayüzünden pipeline denen (kayıtların geleceği kanal) kanalları açmanız gerekmektedir. Graylog kendine özgü GELF (Graylog Extended Log Format) formatında kayıt alabiliyor.

Uygulamalarınızın bunu yapabilmesi için GELF üzerine yapılan basit kütüphanelerden yararlanabilirsiniz.

Öte yandan sadece GELF ile kayıt toplamak zorunda değilsiniz. İsterseniz RAW TCP, UDP olarak uygulamadan yollayabilir, bu gelen verinin nasıl çözümlenmesi gerektiğini ise Graylog üzerinde ayarlayabilirsiniz.

Ayrıca isterseniz KAFKA üzerinden veri yollayabilir, KAFKA sunucunun Topic kayıtlarını izleyebilirsiniz.

Örneğin, geliştirdiğim uygulamalarda NLog kullanmaktayım ve Nlog’un GELF için hazırlanmış yardımcı kütüphanelerini kullanıyorum. UDP üzerinden gönderdiğim kayıtlar belli bir formatta eş zamanlı olarak izleniyor ve bağladığımız koşullara göre bizi uyarıyor.

Filtreleme ve alarm mekanizmaları var. Belli koşullara göre nasıl davranmasını istiyorsanız öyle davranıyor.

Graylog loadbalancer ile entegre olabilir, cluster olarak yapılandırılablir.

Deneyimleyen biri olarak, amaca yönelik, bizim ihtiyaçlarımızı karşılayan bir uygulama olmuş. Ayrıca açık kaynak olmasını bir avantaj olarak görüyorum.

Sonuç olarak, genişleyen sistemlerde, eklenen her uygulamanın, üretilen her verinin analizi, geçmişe yönelik tutulması, eş zamanlı takibini kolaylaştırmak üzere Graylog, kullanıcısı olarak başarılı bulduğum ve amacına hizmet eden bir uygulamadır. 

Uygulamaların davranışlarını takip etmek, gerektiği zaman aksiyon almak, bizim için bu tip uygulamalar sayesinde daha kolaylaşacaktır.