Nedir?
Thrift, Facebook tarafından geliştirilen, C++, C# , Cocoa , Erlang , Haskell , Java, OCaml, Perl, PHP , Python, Ruby, Smalltalk dilleri ile istekler yapıp cevaplar alabileceğiniz bir RPC framework’üdür. Örneğin, PHP kodu içinde, PHP methodlarını kullanarak arka tarafta çalışan bir Python uygulamasına istek gönderip cevap alabilirsiniz.Thrift, binary bir protokol kullandığı için SOAP gibi alternatiflerinden daha performanslı bir iletişim katmanı sunar.Ayrıca en güzel özelliklerinden birisi de asenkron işlemlere izin veren yapısıdır.Kullanım alanları
Thrift, desteklediği diller arasındaki esnek geçişlerle, bir dil ile karşılaştığımız kısıtları başka bir dil ile yazdığımız arka plan servislerinin çözmesine imkan veriyor. Örneğin, PHP’nin en zayıf olduğu multithread gerektiren bir işlem düşünün. 10 farklı veritabanından veri çekmeniz gerekiyor ve her verinin gelmesi 1’er saniye sürüyor. Tek thread üzerinden bu işlemi yapmanız 10*1 = 10 saniye sürecektir. Ama bu işlemi thread desteği daha iyi olan bir dil ile 10 thread’de paralel olarak 1 saniyede yapabiliriz. Thrift’i bu tip işlemler için kullanabilirsiniz.Thrift aynı zamanda “oneway”, yani asenkron işlemlere de izin vermektedir. Asenkron görevler ise zaman zaman çok işimize yarar. Örneğin, kullanıcının yüklediği bir resmi 10 farklı boyutta, üzerlerine filigran basarak, 10 farklı sunucuya yedekleyerek ve bu yükleme işlemini belli yerlere e-posta atarak bildiren bir servisiniz olsun. Yaptığınız her optimizasyona rağmen de bu işlemin 10 saniye sürdüğünü düşünün. Böyle bir işlemde kullanıcı resmi gönderdikten sonra 10 saniye beklemek zorunda kalır. Ama aslında kullanıcının, resmi gönderdikten sonra ve belki resmin ilk kopyası bir sunucuya gönderildikten sonra beklemesine gerek yoktur. Diğer işlem arka planda çalışabilir. Thrift bu tip işlemler için askenkron işlem desteğini sunar.Kurulum
Debian Sid üzerinde Thrift kurulumunu aşağıdaki şekilde yapabilirsiniz.
Yukarıdaki apt komutu ile ilgili paketleri kurduktan sonra aşağıdaki komutla JAVA dizininizi set etmelisiniz.
Daha sonra SVN deposundan güncel sürümü çekip derlemeniz gerekiyor.
Tanımlama Dosyası
Thrift kod üretme araçları, tanımlama dosyalarını kullanarak yukarıda belirtilen diller ile ilgili dosyaları oluşturmanıza yardımcı olur. Bu dosya ile ilgili kodları implemente edeceğiniz PHP, Python, C++, Java interface’lerini oluşturabilirsiniz.Tanımlama dosyalarında, http://wiki.apache.org/thrift/ThriftTypes adresinde belirtilen tiplerdeki verilerle, servis arayüzünüzü yazabilirsiniz.Kod oluşturma
Thrift aslında bir “kod oluşturma kütüphanesi” olarak da tanımlanabilir. Hazırladığınız Thrift tanımlama dosyasından, istediğiniz dil ile sunucu ve istemci tarafını implemente edebileceğiniz kodları oluşturabilirsiniz.Örnek Uygulama
Az laf çok kod 🙂 Şimdi de basit bir Thrift servisi oluşturalım. Servisin 2 tane methodu olsun. Birinci method senkron olarak mevcut zamanı unix time stamp formatında geri döndürsün. İkinci method da alt tarafta çok uzun sürecek bir işlemi (örneğin bir resmin çeşitli boyutlarda 10 kopyasını oluşturup her birini farklı sunuculara upload eden, 10 saniye süren bir işlem) asenkron olarak yapsın. Bunu da bir PHP istemci(client) ve Python sunucu(server) ile yapsın.Öncelikle bu servisi thrift dosyamızda hazırlamalıyız.
Asenkron methodların bir veri döndürmeyeceğini unutmayın. Dolayısıyla her oneway method void türünden veri dönmelidir.
Bu dosyayı Example.thrift olarak kaydettikten sonra PHP ve Python arayüzlerini oluşturmalıyız.
Bu komutlardan sonra gen-php ve gen-py dizinleri içinde Example sınıfları oluşmuş olmalı.
Not: Oluşturulan php dosyasında (gen-php/Example/Example.php) Example_types.php dosyasının “include_once” ile cagirildigi yolun dogru olduguna emin olun veya o satırı yorum satırı haline getirin.
Bundan sonra ise artık istemci ve sunucu kodlarımızı implemente etmemiz gerekiyor. Bir Python sunucu ve PHP istemci kod örneği görelim.PythonServer.py
Daha detaylı bilgi için Thrift Wiki‘yi, burada anlatılan kodların tümü için de http://github.com/yuxel/thrift-examples/ Git deposuna göz atabilirsiniz.