Thriftは高性能の通信サービスフレームワークを拡張できる

5579 ワード

現在流行しているサービス呼び出し方式としては、SOAPメッセージ形式のWebサービス、JSONメッセージ形式のRESTfulサービスなどがある.その中で用いられるデータ伝送方式はXML,JSONなどを含むが,XMLは相対体積が大きすぎて伝送効率が低く,JSON体積が小さく,斬新であるが,まだ十分ではない.ここでは、Facebookが開発したリモート・サービス・コール・フレームワークApache Thriftについて説明します.インタフェースを使用して言語定義を記述し、サービスを作成します.拡張可能な言語間サービス開発をサポートします.コード生成エンジンは、C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、Smalltalkなど、効率的でシームレスなサービスを作成することができます.その伝送データはバイナリフォーマットを採用し、XMLとJSONに比べて体積が小さく、高同時、大データ量、多言語の環境に優れている.この文書では、Thriftの使用について詳しく説明し、ユーザーが迅速にサービスを構築するのに役立つ豊富なインスタンスコードを提供します.
 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
1.thriftをダウンロードし、最新の0.9.0のwindowsバージョンをダウンロードします.2.thriftのディレクトリに入り、サービス記述ファイルを定義し、thriftのサービス記述ファイルは、webサービスのwsdlファイルと同様にthriftで終わる.thriftは、異なる言語間のサービス要件に豊富なデータインタフェースを提供します.そのデータ構造は以下のBase Type:基本タイプ
bool:ブール値、trueまたはfalse、Java対応boolean byte:8ビット符号整数、Java対応byte i 16:16ビット符号整数、Java対応short i 32:32ビット符号整数、Java対応int i 64:64ビット符号整数、Java対応long double:64ビット浮動小数点数、Java対応double string:不明な符号化テキストまたはバイナリ文字列、Java対応String
Struct:構造体タイプContainer:List、Set、Map Exception:例外タイプService:オブジェクトのインタフェースを定義し、一連の方法
 
我々はTestというサービスを定義し,その右のpingメソッドユーザがint 32型のデータを伝送することをテストした.そのthriftファイルの説明は以下の通りです.
 
namespace java net.johnc.thrift
service Test{
 
 void ping(1: i32 length)
 
}

Testというサービスが定義され、1:ユーザ識別パラメータの番号が定義されていることがわかります.
 
    3. thriftのディレクトリに入り、$thrift-r--gen java testを実行します.thrift//-rはincludeのファイルに対してもサービスコードを生成する-genはサービスコードを生成する言語であり、$gen-javaのディレクトリに入ると対応するjavaファイルが生成され、このファイルは対応するサービス側とクライアントの実装である[実はここでもweb servicesでwsdlによって対応するコードを生成する場合に似ている].
 
    4.クライアントの作成
  
  TTransport transport;
       try {
           transport = new TSocket("localhost", 1234);
           TProtocol protocol = new TBinaryProtocol(transport);
           Test.Client client = new Test.Client(protocol);
           transport.open();
           client.ping(2012);
           transport.close();
       } catch (TTransportException e) {
           e.printStackTrace();
       } catch (TException e) {
           e.printStackTrace();
       }

以上のように、クライアントはサービス側のようにpingメソッドを呼び出し、2012という数値を送信する.
 
  
 
   5.サービス・エンドの作成
サービス実装クラスTestImpl
  
public class TestImpl implements Test.Iface{

	public void ping(int length) throws TException {
		System.out.println("client length:"+length);
	}

}

サービス起動クラスサーバ
 
   
public class Server {
   public void startServer() {
       try {

           TServerSocket serverTransport = new TServerSocket(1234);

           Test.Processor process = new Processor(new TestImpl());

           Factory portFactory = new TBinaryProtocol.Factory(true, true);

           Args args = new Args(serverTransport);
           args.processor(process);
           args.protocolFactory(portFactory);

           TServer server = new TThreadPoolServer(args);
           server.serve();
       } catch (TTransportException e) {
           e.printStackTrace();
       }
   }

   public static void main(String[] args) {
       Server server = new Server();
       server.startServer();
   }
}

 
    6.サービス側とクライアントを別々に起動することで、クライアントがサービス側にint数値を送信する効果を実現
 
 
例から分かるようにthriftのワークフロー
   
FooService:サービス記述ファイルです.thriftが生成され、異なる言語で異なるバージョンを生成することができる.thriftは現在、C+,C#,Cocoa,Erlang,Haskell,Java,Ocami,Perl,PHP,Python,Ruby,Smalltalkなどの言語をサポートしている(本例ではjavaを例に挙げる).
Foo.read()/writer():サービスの次のレベルで基礎的な読み書き方法を提供し、クライアントはサービス側にデータを書くことができ、サービス側からデータを受信することができ、サービス側はクライアントにデータを書くことができ、クライアントにデータを読み取ることができる.
Foo.read()/writer():サービスの次のレベルで基礎的な読み書き方法を提供し、クライアントはサービス側にデータを書くことができ、サービス側からデータを受信することができ、サービス側はクライアントにデータを書くことができ、クライアントにデータを読み取ることができる.
TProcotol:トランスポートプロトコル層、thriftは豊富なトランスポートプロトコルを提供し、主に以下を含む.
TbinaryProtocol–バイナリ符号化フォーマットでデータ転送を行います.
TCompactProtocol–このプロトコルは非常に有効で、Variable-Length Quantity(VLQ)符号化を使用してデータを圧縮します.
TJSOnProtocol–JSONのデータ符号化プロトコルを使用してデータ転送を行います.
TSimpleJSOnProtocol–この節約はJSONが書くプロトコルのみを提供し、スクリプト言語による解析に適しています.
TDebugProtocol–開発中に開発者のデバッグを支援し、テキスト形式で読みやすいようにします.
TTransport:
TSocket-渋滞I/Oで転送するのも、最も一般的なパターンです.
TFRamedTransport-JavaのNIOに似たブロックサイズで非ブロック方式で転送されます.
TFIleTransport-Javaの実装は提供されませんが、その実装は非常に簡単です.
TMemoryTransport-メモリI/Oを使用すると、JavaのByteArrayOutputStreamのように実現されます.
TZlibTransport-実行zlib圧縮を使用し、Javaの実装を提供しません.
 
サービス側は、クライアント要求の処理においても、以下のような複数のモードを提供する.
TSimpleServer:シングルスレッドブロック方式
TThreadPoolServer:マルチスレッドブロック方式TnonblockingServer:非ブロック方式ブロック伝送データ
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
パフォーマンステスト
プロトコル転送量の比較
 
 
プロトコル消費リソースの比較