Apache Thrift adalah sebuah framework software berbasis RPC yang dikembangkan di Facebook. Tujuannya adalah untuk memfasilitasi komunikasi antar layanan yang scalable, efisien, dan andal di lingkungan multi-bahasa pemrograman. Thrift menangani semua “pipa ledeng” komunikasi jaringan, termasuk serialisasi, definisi service, dan model threading server.
IDL (Interface Definition Language)
Inti dari Thrift adalah IDL. Ini adalah sebuah file definisi (.thrift) tempat pengembang mendeskripsikan struktur data (structs) dan layanan (services atau kumpulan fungsi) secara independen dari bahasa pemrograman. Kompiler Thrift (thrift) kemudian menggunakan file IDL ini untuk menghasilkan kodeboilerplate(stubs) untuk klien dan server dalam berbagai bahasa (Java, Python, C++, dll.). Ini memungkinkan, misalnya, server yang ditulis dalam C++ untuk dipanggil dengan mudah oleh klien Node.js.
Tipe Data dan Evolusi Service
IDL mendukung tipe data dasar (bool, i32, string), tipe khusus (binary), dan kontainer (list, set, map). Salah satu fitur kunci IDL adalah penomoran parameter secara eksplisit (e.g., i32 add(1:i32 n1, 2:i32 n2)).
Ini sangat penting untuk memungkinkan evolusi service. Dengan nomor posisi yang tetap, pengembang dapat menambah, mengubah nama, atau bahkan menghapus parameter di masa depan tanpa merusak kompatibilitas dengan klien lama, selama nomor ID parameter yang ada tidak diubah. Aturan yang sama berlaku untuk field di dalam struct.
Arsitektur Framework Thrift
Framework Thrift dapat dibagi menjadi beberapa lapisan (layer) yang saling bekerjasama:
Kode Buatan Pengguna: Ini adalah logika bisnis sebenarnya, yaitu implementasi handler di sisi server dan kode pemanggil di sisi klien.
Kode Hasil Kompilasi IDL:
Service Stubs: Kode boilerplate yang menyederhanakan pemanggilan fungsi remote.
User Types: Representasi struct dan exception dari IDL dalam bahasa target.
Pustaka Runtime Thrift:
Protocol (TProtocol): Lapisan yang bertanggung jawab untuk serialisasi. Jenis-jenisnya antara lain:
TBinaryProtocol: Format biner standar.
TCompactProtocol: Format biner yang sangat efisien dan padat.
TJSONProtocol: Menggunakan JSON untuk encoding.
TSimpleJSONProtocol: Format JSON write-only untuk scripting.
TDebugProtocol: Format teks yang mudah dibaca manusia untuk debugging.
Transport (TTransport): Lapisan yang menangani pembacaan/penulisan byte. Jenis-jenisnya antara lain:
TSocket: Menggunakan blocking socket I/O untuk komunikasi TCP.
TFramedTransport: Mengirim data dalam frame (wajib untuk server non-blocking).
TFileTransport: Menulis data ke sebuah file.
TMemoryTransport: Menggunakan memori untuk I/O.
TZlibTransport: Melakukan kompresi menggunakan zlib.
Processor (TProcessor): Di sisi server, ini adalah “lem” yang membaca data dari protocol, memanggil handler yang sesuai, dan menuliskan hasilnya kembali ke protocol.
Server (TServer): Komponen tingkat tinggi di sisi server. Jenis-jenis server yang disediakan:
TSimpleServer: Single-threaded dengan blocking I/O, baik untuk testing.
TThreadPoolServer: Multi-threaded dengan blocking I/O.
TNonblockingServer: Multi-threaded dengan non-blocking I/O (harus menggunakan TFramedTransport).
Alur Pengembangan
Buat File .thrift: Definisikan semua tipe data (struct) dan fungsi (service).
Generate Kode: Jalankan kompiler Thrift untuk menghasilkan kode stub untuk bahasa server dan klien.
Implementasi Server: Buat sebuah kelas handler yang mengimplementasikan interface service yang dihasilkan oleh kompiler, lalu jalankan TServer.
Implementasi Klien: Gunakan kelas client yang dihasilkan untuk membuat koneksi ke server, lalu panggil fungsi-fungsi remote seolah-olah mereka adalah fungsi lokal.
Contoh:
namespace java if4031typedef i32 intservice CalculatorService{ int multiply(1:int n1, 2:int n2), int add(1:int n1, 2:int n2),}
Pembangkitan
thrift –gen <bahasa> calculator.thrift
Menghasilkan:
Kelas interface (Iface) service
Kelas client dan Processor (untuk server)
Kelas yang merepresentasikan struktur/tipe data dan exception (jika ada)
Performance
Summary
Apache Thrift adalah framework RPC yang kuat untuk membangun layanan lintas bahasa yang efisien, dengan menggunakan Interface Definition Language (IDL) sebagai pusatnya untuk mendefinisikan struktur data dan service. Arsitekturnya yang berlapis memisahkan logika bisnis dari detail komunikasi, di mana lapisan Transport menangani pengiriman byte, lapisan Protocol mengurus serialisasi (misalnya ke format biner yang ringkas), dan kode yang dihasilkan otomatis oleh kompiler Thrift menyediakan “lem” yang menghubungkan semuanya, memungkinkan pengembangan yang cepat dan service yang mudah berevolusi.
Additional Information
Pendalaman Teknis: Perbandingan Kinerja
Seperti yang ditunjukkan pada grafik di slide 29, performa Thrift (terutama dengan TCompactProtocol dan TSocket) jauh mengungguli arsitektur berbasis HTTP/Teks seperti REST/JSON dan SOAP/XML. Waktu yang dibutuhkan untuk menyelesaikan 1 juta request bisa 10 hingga 20 kali lebih cepat. Ini karena:
Serialisasi Biner: Format TCompactProtocol sangat padat dan efisien, menghasilkan payload yang jauh lebih kecil.
Overhead Protokol: Komunikasi langsung melalui TCP (TSocket) menghilangkan semua overhead dari parsing header HTTP.
Inilah alasan utama mengapa Thrift dan gRPC menjadi pilihan utama untuk komunikasi latensi rendah antar microservices di dalam data center.
Eksplorasi Mandiri: Kapan Menggunakan required vs. optional?
Di dalam struct Thrift, Anda dapat menandai field sebagai required atau optional.
required: Thrift akan memastikan field ini selalu ada saat serialisasi dan deserialisasi. Jika tidak ada, ia akan melempar exception. Gunakan ini untuk data yang mutlak harus ada agar objek valid.
optional: Field ini mungkin ada atau tidak. Jika tidak ada, ia akan diabaikan. Gunakan ini untuk data yang tidak krusial atau ditambahkan pada versi service yang lebih baru.
Aturan praktisnya: Mulailah dengan optional untuk sebagian besar field kecuali Anda benar-benar yakin data tersebut tidak akan pernah bisa absen. Ini memberikan fleksibilitas terbesar untuk evolusi skema di masa depan.