是否有针对节俭的IPC传输实现?或低延迟 SOA 解决方案


Is there an IPC transport implementation for Thrift ? or low latency SOA solutions

我想将SOA引入到一个没有TCP通信开销的低延迟系统中(即使在同一台机器上)。Thirft似乎很合适,因为我同时拥有Java和php进程。是否有用于节俭的 IPC 传输实现,或者在这种情况下可以提供帮助的任何其他好主意?

您可以使用

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

  1. 我们有一个 Message 类型的对象,其中包含一些信息
  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);
}
?>

爪哇消费者

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

请参阅此处了解 Thrift C++ 库的跨平台管道传输。这应该可以直接移植到其他语言。如果你只需要支持*NIX,你可以使用TSocket已经支持的域套接字。只需传入(名称)而不是(主机,端口)到其构造函数。