Apache Thrift: giới thiệu và cài đặt

Chào mừng các bạn đã quay trở lại với thachleblog. Quay lại chủ đề software framework hôm nay, mình sẽ giới thiệu về Apache Thift – một framework được sử dụng khá rộng rãi trong các hệ thống backend. Theo mình nghĩ thì sẽ có nhiều bạn gặp khó khăn khi bắt đầu làm quen với Thrift, vì documents chính thức hơi khó hiểu (đối với mình, hehe). Do đó, hy vọng bài viết này của mình sẽ giúp các bạn mới làm quen với Thift tiết kiệm được thời gian trong bước đầu tìm hiểu. Tất nhiên, các bạn không làm backend thì cũng đọc cho biết ^.^. Nào, chúng ta cùng bắt đầu nhé.

Giới thiệu

Thrift là một IDL (interface definition language – tương tự như protobuf) và là một binary communication protocal (cái này thì không biết dịch sao cho đúng, chúng ta có thể hiểu nó là một giao thức truyền dữ liệu dưới dạng binary). Thrift cung cấp chuẩn RPC (memote proceduce call) dùng để giao tiếp cho các service thông qua network (TCP). Thrift ban đầu được phát triển bởi facebook, và hiện tại là mã nguồn mở thuộc Apache project.

Kiến trúc

Thrift sẽ cho phép chúng ta định nghĩa datatypes và service interface bằng ngôn ngữ trung lập (source file định dạng .thrift). Sau đó, Thrift compiler sẽ build source file này thành các file class. Ởserver, chúng ta sẽ implement method từ file class Thrift, project client có thể “gọi” method mà server cung cấp thông qua service (interface) được định nghĩa sẵn.

Hiện tại Thrift hỗ trợ các ngôn ngữ bao gồm C++, Java, PHP, Python và Ruby.

Hình minh họa Kiến trúc Thrift

Có thể hiểu nếu project A được là xem là server Thrift, cung cấp method a, các project B, C là client có thể gọi method a từ A thông qua service được định nghĩa bởi Thrift. Ngoài ra, C cũng có thể là service để A có thể gọi … . Hay nói cách khác, Thrift cung cấp chuẩn để các service có thể “giao tiếp” với nhau.

Ví dụ minh họa các project có thể "giao tiếp" thông qua ThriftSơ đồ minh họa khả năng “giao tiếp” của các service (project) thông qua Thrift

So sánh Thrift

Biểu đồ so sánh kích thước object được serializable (gói tin) giữa Thrift và Probuf, XML, JSON, RMI

Biểu đồ so sánh kích thước

Biểu đồ so sánh kích thước object được serializable bằng các chuẩn

Có cả phần so sánh hiệu năng, các bạn có thể đọc thêm tại đây

Thrift compiler

Thrift compiler là tool được sử dụng Thrift compiler để build file .thrift thành các class file tương ứng. Bài viết hôm nay mình sẽ hướng dẫn cách cài đặt Thrift compiler trên ubuntu.

  • Đầu tiên, chúng ta cần cài đặt ant để có thể build Thrift
    sudo apt-get install ant
  • Tiếp theo, chúng ta cần cài đặt libs cần thiết để build Thrift
    sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libboost-filesystem-dev libboost-thread-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
    
  • Sau đó, chúng ta có thể tải Thrift compiler từ trang chủ, giải nén và chạy lệnh config để kiểm tra:
    ./configure

Kết quả: (các dòng cuối sau khi chạy command)

thrift 0.9.3

Building C++ Library ......... : yes
Building C (GLib) Library .... : no
Building Java Library ........ : yes
Building C# Library .......... : no
Building Python Library ...... : yes
Building Ruby Library ........ : no
Building Haskell Library ..... : no
Building Perl Library ........ : no
Building PHP Library ......... : no
Building Erlang Library ...... : no
Building Go Library .......... : no
Building D Library ........... : no

C++ Library:
   Build TZlibTransport ...... : yes
   Build TNonblockingServer .. : yes
   Build TQTcpServer (Qt) .... : no

Java Library:
   Using javac ............... : javac
   Using java ................ : java
   Using ant ................. : /usr/bin/ant

Python Library:
   Using Python .............. : /usr/bin/python
  • Mọi thứ đã sẵn sàng, chúng ta sẽ dùng lệnh make để build
    sudo make
  • Buid xong thì có thể chạy lệnh check để kiểm tra quá trình build có thiếu thư viện gì không, nếu [Pass] hết thì đã thành công
    sudo make check
  • Bước cuối cùng, chạy lệnh install để cài đặt
    sudo make install
  • Kiểm tra version bằng lệnh
    thrift -version
    

    Vì mình tải về phiên bản 0.9.3 nên kết quả sẽ là:

    Thrift version 0.9.3

Tới bước này thì chúc mừng các bạn, các bạn đã cài đặt Thrift compiler thành công. Giờ thì các bạn có thể sử dụng Thrift compiler để build một source file đơn giản (calculator). Sau đó có thể follow theo ví dụ để tạo 2 project Server và Client.

Project client có thể gọi các method từ project server thông qua Thrift. Mình cũng chỉ mới tới bước này. Tiếp đến cần debug và đọc document để hiểu hơn.

Kết

Hy vọng đọc tới đoạn này các bạn đã hiểu được cơ chế của Thrift và đã có thể build được source file .thrift. Mọi thắc mắc hay vấn đề gì các bạn có thể comment bên dưới, mình sẽ follow. Hẹn gặp lại các bạn ở các bài viết sau.

Tham khảo thêm:

Tìm hiểu Google protocol buffer

Chào mừng các bạn đã quay lại với thachleblog. Ở bài trước, mình có giới thiệu về serialize và deserialize để convert object sang dạng byte stream (và ngược lại). Tuy nhiên, dữ liệu dạng byte stream này không thể chia sẻ cho các ứng dụng được viết bằng các ngôn ngữ khác. Google có phát triển một platform để giải quyết vấn đề này chính là Protocol Buffer (viết tắt là protobuf). Protobuf giải quyết vấn đề này như thế nào? Cơ chế hoạt động ra sao, chúng ta cùng tìm hiểu nhé.

Giới thiệu

Protocol Buffer là một platform được phát triển bởi google được sử dụng để serialize dữ liệu thành dạng byte stream (tương tự Thrift của facebook và Microsoft Bond protocols). Phiên bản đầu tiên được giới thiệu vào năm 2008, phiên bản mới nhất hiện tại là 3.3.0.

Ưu điểm

Như mình đã đề cập ở phần giới thiệu, protobuf giải quyết vấn đề của serialize trong Java đó là dữ liệu được serialize chỉ đọc được bởi Java. Dữ liệu được serialize bởi protobuf có thể được deserialize bằng các ngôn ngữ khác nhau.

Ngoài ra, dữ liệu protobuf nhẹ và nhanh hơn so với xml và json, sau đây là so sánh giữa dữ liệu protobuf và XML:

  • Dữ liệu protobuf “nhẹ hơn” từ 3 – 10 lần
  • Protobuf xử lý nhanh hơn 20 – 100 lần

Nguồn: https://developers.google.com/protocol-buffers/docs/javatutorial

Do đặc điểm là “nhẹ” và nhanh của dữ liệu được serialize bởi protobuf, vì vậy protobuf sẽ đặc biệt thích hợp trong các ứng dụng data real-time hoặc trao đổi dữ liệu trực tiếp (ví dụ các ứng dụng web chat)

Cơ chế hoạt động

Protobuf cho phép định nghĩa object dưới dạng struct (message) với định dạng .proto. File này sẽ được dùng chung để protobuf compiler compile sang các ngôn ngữ tương ứng. Do đó, object này có thể được sử dụng bởi các ngôn ngữ khác nhau. Về cơ chế mình cũng thấy giống giống như JVM. Các bạn có thể xem lại bài Tại sao Java là một ngôn ngữ lập trình độc lập nền tảng?

Tìm hiểu Google protocol buffer

Hình minh họa vai trò của protocal buffer compiler

Cài đặt và sử dụng

Đầu tiên chúng ta sẽ cần tải protobuf compiler tại https://github.com/google/protobuf/releases, có bản cho cả windown, linux và macos.

Sau khi giải nén là ta đã có thể sử dụng. Kiểm tra version bằng lệnh: protoc –version

Tiếp theo, chúng ta cần định nghĩa file .proto theo cấu trúc struct, dưới đây là file addressbook mình lấy trong thư mục example:

// [START declaration]
syntax = "proto3";
package tutorial;
// [END declaration]
 
// [START java_declaration]
option java_package = "thach.le.protobuf";
option java_outer_classname = "AddressBookProtos";
// [END java_declaration]
 
 
// [START messages]
message Person {
  string name = 1;
  int32 id = 2;  // Unique ID number for this person.
  string email = 3;
 
  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
 
  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }
 
  repeated PhoneNumber phones = 4;
}
 
// Our address book file is just one of these.
message AddressBook {
  repeated Person people = 1;
}
// [END messages]

Ghi chú:

  • message: theo cấu trúc struct, khi build thành file .java, mỗi message sẽ tương ứng với 1 class mỗi message có các variable được đánh số thứ tự từ 1 – 15
  • repeated: được hiểu tương tự như kiểu array, list trong Java

……

Các bạn có thể đọc thêm docs để hiểu thêm về cú pháp của proto

Sau khi đã có file .proto, chúng ta có thể build thành các file tương ứng, dưới đây mình build cho java và js.

  • protoc -I=C:\protoc-3.3.0-win32\bin\source —java_out=build C:\protoc-3.3.0-win32\bin\source\addressbook.proto
  • protoc -I=C:\protoc-3.3.0-win32\bin\source —js_out=library=AddressBook,binary:. C:\protoc-3.3.0-win32\bin\source\addressbook.proto

Vì mình không xét CLASS_PATH cho protoc nên mình phải truyền đường dẫn tuyệt đối cho file input. Các bạn có thể đọc thêm để hiểu cú pháp generate file này.

Kiểm tra thư mục C:\protoc-3.3.0-win32\bin\source, giờ thì các bạn đã có các file Java và JS để có thể serialize và deserialize object. Các bạn có thể tham khảo cách sử dụng cách sử dụng probuf object cho Java và JS tại đây.

Kết

Tuần vừa rồi thì mình có làm ứng dụng web chat (360live.vn/live) có sử dụng probufer, thật sự thì mình thấy việc trao đổi dữ liệu giữa server và client thông qua probufer rất dễ dàng và nhanh. Hy vọng bài viết của mình sẽ giúp các bạn tiếp cận nhanh hơn với protobufer…

Mọi thắc mắc, góp ý vui lòng comment bên dưới. Xin cảm ơn và hẹn gặp lại các bạn ở các bài viết sau.

Tham khảo thêm:

https://developers.google.com/protocol-buffers/docs/overview

https://github.com/google/protobuf/tree/master/js

https://developers.google.com/protocol-buffers/docs/javatutorial