Cumartesi, Temmuz 21, 2007

Quartz Scheduler

Özellikle kurumsal uygulamalardaki en kritik konulardan biri de belli bir saatte çalışması planlanmış batch işlemleridir. Örneğin Bankacalık Uygulamalarındaki Otomatik Ödeme Talimatları, Havale ve EFT talimatları, Günsonu işlemleri, vs. "Job Scheduler" diye adlandırılan araçlar ile gerçekleştirilmektedir.

Bu işlemler arkaplanda, kullanıcı ile bir etkileşimi olmadan çalıştığı için aynı anda yüzlerce thread'in çalışmasına neden olabilir. Bu yüzden bu araçların işlerini, sistem kaynaklarını en verimli bir şekilde kullanarak, hata yapmadan, yapsa bile loglayarak veya daha sonra düzelterek (recovery) çalışması gerekmektedir. Özellikle bankacılık gibi kritik uygulamaların günsonu işlemlerinde milyon dolar'ların işlendiğini düşünecek olursanız bu araçların önemi daha iyi anlaşılacaktır.

İşte bu blogum'da daha evvel geliştirdiğimiz bir çok uygulamamızda kullandığımız Quartz Scheduler'dan bahsedeceğim. Hatta bahsetmekle kalmayacak, Quartzla ilgili yazdığım bir örneği de paylaşacağım.

Quartz, dünyaca ünlü bir çok lisanslı uygulamanın da kullandığı açık kaynak uygulama. Quartz halen, bünyesinde WebWork (Strus ile birleşip Strus2 adını aldı), SiteMesh, OSCache gibi dünyaca ünlü açık kaynak projeleri barındıran OpenSymphony Açık Kaynak topluluğu altında geliştirilmekte. Açık Kaynak uygulamaları kullanmakta hala tereddüt edenleri biraz rahatlattıktan sonra Quartz'ın özelliklerine geçelim.

Quartz öncelikle her türlü Java Uygulamasının bir parçası şeklinde çalışabiliyor:
* Quartz can run embedded within another free standing application
* Quartz can be instantiated within an application server (or servlet container), and participate in XA transactions
* Quartz can run as a stand-alone program (within its own Java Virtual Machine), to be used via RMI
* Quartz can be instantiated as a cluster of stand-alone programs (with load-balance and fail-over capabilities)
Quartz'ın XA Transaction desteği aslında çok önemli bir özellik, maalesef bir çok yazılım geliştirici XA'in (Distributed Transactions) öneminin farkında olmadığı için veritabanları üzerinde uyumsuz (inconsistant) veriler bulunmakta.

Quartz bir özelliği de, dünyaca ünlü Strus ve Spring gibi framework'lere kolayca entegre edilebilir olması:

* Quartz'ın Spring ile Entegrasyonu
* Quartz'ın Strus ile Entegrasyonu

Quartz'ın en önemli özelliklerinden biri de Trigger diye adlandırlan çok farklı tetikleme mekanizmasına sahip olması:
* at a certain time of day (to the millisecond)
* on certain days of the week
* on certain days of the month
* on certain days of the year
* not on certain days listed within a registered Calendar (such as business holidays)
* repeated a specific number of times
* repeated until a specific time/date
* repeated indefinitely
* repeated with a delay interval
Quartz'ın bir başka özelliği de çalıştırdığı işlerin transactional bir şekilde gerçekleştirebilmesi. Ayrıca Clustering ve Job Persistence desteği sayesinde bir veritabanı üzerinde işlerini saklayabiliyor ve cluster node'ları arasında dağıtabiliyor:
* The design of Quartz includes a JobStore interface that can be implemented to provide various mechanisms for the storage of jobs.
* With the use of the included JDBCJobStore, all Jobs and Triggers configured as "non-volatile" are stored in a relational database via JDBC.
* With the use of the included RAMJobStore, all Jobs and Triggers are stored in RAM and therefore do not persist between program executions - but this has the advantage of not requiring an external database.
* Quartz can participate in JTA transactions, via the use of JobStoreCMT (a subclas of JDBCJobStore).
* Quartz can manage JTA transactions (begin and commit them) around the execution of a Job, so that the work the Job does happens within a JTA transaction.
* Fail-over.
* Load balancing.
Quartz'ın diğer özelliklerini ve güzelliklerini anlatmam saatler sürer. Bunun yerine kendi sitesindeki tutorial'lara bir gözatmanızda fayda var. Ayrıca aşağıda linkini paylaştığım Quartz'ın Cluster modda kullanımı ile ilgili bir örneğe göz atabilirsiniz.

Quartz JDBCJobStore Tutorial

Bu blogu okuyanlar arasında "Ne gerek var Java'da Scheduler kullanmaya" diye düşünenler olabilir. Bu soruya cevap vermeden evvel alternatifleri düşünelim:

1) Batch işlemlerinin veritabanı job'ları olarak çalıştırılması
Bu yöntem zaten şu an en yaygın kullanılan yöntemlerden birisi. Veritabanı diğer kullanıcı işlemleri nedeniyle yük altında değilken veya batch olarak işlenen çok fazla veri yokken bu yöntem çok sağlıklı çalışır. Peki yükümüz her geçen gün artarsa ne yapacağız, unutmayın veritabanı üzerinde çalışan fonksiyonlar bir yandan hesaplama yapmak için bir yandan da kayıtları güncellemek için sistem kaynaklarını kullanırlar. Kaynaklarınız yetmediği zaman aynı orta katmanda olduğu gibi veritabanlarınızı çoğaltamazsınız.

Ama Quartz kullanıyorsanız veritabanını sadece insert, update ve delete işlemleri için kullanılıyor, tüm business fonksiyonları ise Quartz'ın çalıştığı başka sunucular üzerinde işleniyor olacak. Kaynak ihtiyacınız arttıkça yeni sunucular ekleyebileceksiniz. (Load-balancing)

2) Batch işlemlerinin işletim sistemi (unix/windows) job'ları olarak çalıştırılması
Bu yöntem aslında ilk bakışta Quartz'ın load-balancing özelliğini karşılıyor gibi gözüküyor. Shell script yazılarak Unix'in cron'una eklenen batch işlemlerin en zayıf yani recovery'dir. Kısaca özetlemek gerekirse Quartz'ın cluster node'ları arasında "Quartz Kardeşliği" diye bir kavram vardır. Hiç bir kardeş diğerine hükmetmez ama arkasını kollar. Kardeşlerden biri çalışırken hata alırsa diğerleri onun işlerini halledebilirler. Eğer aralarına başka bir kardeş daha katılırsa ellerindeki işleri diğer kardeşle paylaşırlar. Shell scriptler ile bu işleri yapmak çok zordur. (Fail-over)

Etiketler:

4 Yorum:

Anonymous Adsız dedi ki...

Elline sağlık Mustafa Abi çok keyifli bir blog olmuş.

Ciddi işlerde işletim sistemine ait scheduling özelliğini kullanmak çok abes bir yaklaşım olacaktır. En azından windows platformu için kati suretle önerilmez :)

Veritabanında job yapmak işletim sistemi seviyesinde yapmaktan biraz daha güvenilir görünüyor ama perfomans konusunda bu defa sıkıntı olacaktır.

Akılama takılan bir soru ise misal SQL Server ile job yatığımızda belirli durumlarda (özellikle de olağan dışı bir durum olduğunda) loglamanın haricinde bizleri bilgilendirme yeteneğine sahip (net send mesajları,mail, alerter vb) acaba Quartzda da bu tip bir imkanımız olur mu? ÖZellikle de 7/24 sistemini aykata tutmak isteyen kişiler için bunun önemli bir özellik olduğunu düşünüyorum .

Selamlar.

9:13 ÖÖ  
Blogger Mustafa Tan dedi ki...

Selam İbrahim,

Quartz'ın TriggerListeners, JobListeners ve SchedulerListeners olmak üzere 3 adet Listener interface'i bulunmakta. Bu interface'ler kullanılarak her türlü bilgilendirme mesajı mail, sms, netsend, vs. yoluyla gönderilebilir.

Ayrıca Quartz'ın bir de .NET versiyonu geliştirilmekte:

http://quartznet.sourceforge.net/

2:35 ÖS  
Anonymous Adsız dedi ki...

Teşekkürler Mustafa Abi,

Sorumun cevabını da aldığıma göre job scheduling için DMBS'i yormanın lüzumu olmadığını da görmüş oldum.

Sanırım ben de DBMS 'ler sadece veri saklamak içindir ,iş süreçlerinizi DBMS 'den uzak tutun diyenler grubuna doğru yavaş yavaş kayıyorum :)

İyi çalışmalar.

2:46 ÖS  
Anonymous Adsız dedi ki...

Mustafa Bey Merhaba,

Aradan bir hayli zaman geçmiş ama quartz ile ilgili yapmış olduğunuz örneğin linkini yenileyebilir misiniz?

Teşekkürler.

6:42 ÖS  

Yorum Gönder

Kaydol: Kayıt Yorumları [Atom]

<< Ana Sayfa