gpt4 book ai didi

java - Thrift 是否有 IPC 传输实现?或低延迟 SOA 解决方案

转载 作者:可可西里 更新时间:2023-11-01 12:35:45 25 4
gpt4 key购买 nike

我想将 SOA 引入到一个没有 TCP 通信开销(即使在同一台机器上)的低延迟系统中。 Thirft 似乎非常适合,因为我同时拥有 Java 和 php 进程。是否有用于 thrift 的 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"

关于java - Thrift 是否有 IPC 传输实现?或低延迟 SOA 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10608531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com