Thrift有IPC传输实现吗?或低延迟SOA解决方案

时间:2012-05-15 20:37:41

标签: java php ipc soa thrift

我想在没有TCP通信开销的情况下(即使在同一台机器上)将SOA引入低延迟系统。 Thirft看起来非常合适,因为我有Java和php进程。是否有针对节俭的IPC传输实现,或任何其他有益于这种情况的好主意?

2 个答案:

答案 0 :(得分:5)

您可以使用Thrift序列化您的对象,然后使用您喜欢的IPC方法(命名管道,消息队列等)。 以下是使用管道的简单示例

  1. 我们有一个Message类型的对象,其中包含一些信息
  2. Php进程是消息的制作者
  3. Java流程是消费者
  4. 节俭模型

    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 Consumer

            //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"
    

答案 1 :(得分:2)

See here关于Thrift C ++库的跨平台管道传输。这应该是直接移植到其他语言。如果您只需要支持* NIX,则可以使用TSocket已经支持的域套接字。只需将(name)而不是(host,port)传递给它的构造函数。