8

TCP通信のオーバーヘッドがなく(同一マシンでも)、低レイテンシなシステムにSOAを導入したい。私は Java と php の両方のプロセスを持っているので、Thirft はぴったりだと思います。倹約のための IPC トランスポートの実装、またはこのシナリオで役立つ他の良いアイデアはありますか?

4

2 に答える 2

5

Thriftを使用してオブジェクトをシリアル化し、好みのIPCメソッド(名前付きパイプ、メッセージキューなど)を使用できます。以下は、パイプを使用した簡単な例です

  1. いくつかの情報を含むメッセージタイプのオブジェクトがあります
  2. PHPプロセスはメッセージのプロデューサーです
  3. Javaプロセスは消費者です

倹約モデル

struct Message {
  1: i32 uid,
  2: string information,
}

倹約源を生成する

thrift --gen java message.thrift
thrift --gen php message.thrift

PHPプロデューサー

<?php
$GLOBALS['THRIFT_ROOT'] = 'src';
require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php';
require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinarySerializer.php'; // this generates serialized string from our obect
require_once $GLOBALS['THRIFT_ROOT'].'/packages/message/message_types.php'; //from generated thrift sources
//create new message
$message = new Message();
$message->uid = '1';
$message->information = 'Some info';
var_dump($message);

//serialize
$serializer = new TBinarySerializer(); 
$serialized_message = $serializer->serialize($message);
var_dump($serialized_message);

//write to a pipe
if (pcntl_fork() == 0) {
$namedPipe = '/tmp/pipe';
if (! file_exists($namedPipe)) {
   posix_mkfifo($namedPipe, 0600);
}

$fifo = fopen($namedPipe, 'w');

fwrite($fifo, $serialized_message);
exit(0);
}
?>

Javaコンシューマー

        //read from pipe
    FileInputStream fileInputStream = new FileInputStream(new File("/tmp/pipe"));
    int availableBytes = fileInputStream.available();

    byte[] b = new byte[availableBytes]; 
        fileInputStream.read(b , 0, availableBytes);
        //deserialize
    TDeserializer tDeserializer = new TDeserializer();
    Message deserMessage = new Message();
    tDeserializer.deserialize(deserMessage, b);
    System.out.println(deserMessage.getInformation());
    //prints "Some info"
于 2012-05-21T00:09:11.720 に答える
2

Thrift C++ ライブラリのクロスプラットフォーム パイプ トランスポートについては、こちらを参照してください。これは、他の言語への移植が簡単なはずです。*NIX のみをサポートする必要がある場合は、TSocket で既にサポートされているドメイン ソケットを使用できます。(ホスト、ポート) の代わりに (名前) をコンストラクターに渡すだけです。

于 2012-06-09T18:48:34.563 に答える