Существует ли транспортная реализация IPC для Thrift? или решения с низкой задержкой SOA

Я хочу ввести 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); } ?> 

    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" 

    См. Здесь относительно кросс-платформенного переноса труб для библиотеки Thrift C ++. Это должно быть прямой перенос на другие языки. Если вам нужно только поддерживать * NIX, вы можете использовать сокеты домена, которые уже поддерживаются TSocket. Просто передайте (name) вместо (host, port) в свой конструктор.