Java 是否有针对节俭的IPC运输实施?或低延迟SOA解决方案
我想将SOA引入一个低延迟系统,而不需要TCP通信的开销(即使在同一台机器上)。Thirft似乎非常适合,因为我有Java和php进程。是否有一个针对thrift的IPC传输实现,或者有任何其他好主意可以在这种情况下提供帮助?您可以使用thrift来序列化对象,然后使用您喜欢的IPC方法(命名管道、消息队列等)。 下面是一个使用管道的简单示例Java 是否有针对节俭的IPC运输实施?或低延迟SOA解决方案,java,php,ipc,soa,thrift,Java,Php,Ipc,Soa,Thrift,我想将SOA引入一个低延迟系统,而不需要TCP通信的开销(即使在同一台机器上)。Thirft似乎非常适合,因为我有Java和php进程。是否有一个针对thrift的IPC传输实现,或者有任何其他好主意可以在这种情况下提供帮助?您可以使用thrift来序列化对象,然后使用您喜欢的IPC方法(命名管道、消息队列等)。 下面是一个使用管道的简单示例 我们有一个Message类型的对象,它包含一些信息 Php进程是消息的生产者 Java进程是消费者 节俭模式 产生节俭资源 thrift --gen ja
thrift --gen java message.thrift
thrift --gen php message.thrift
PHP制作人
关于节流C++传输的跨平台管道传输。这应该直接连接到其他语言。如果您只需要支持*NIX,那么可以使用TSocket已经支持的域套接字。只需将(名称)而不是(主机、端口)传递给其构造函数。
请澄清您的评论“服务器方法路由”。Thrift提供的不仅仅是序列化,生成的代码允许您进行客户端调用,调用服务器上的远程过程。我宁愿避免自己进行路由,也就是说,应该调用哪个方法。Unix管道是1:1连接(每个“服务器”只有一个客户端)。域套接字更像Windows命名管道,因为它们可以支持多个连接(客户端)。虽然上面的解决方案很巧妙,但它没有利用节俭的威力及其分层架构。您的代码似乎假设您将从消息边界的管道中获取数据(我怀疑在实践中会发生这种情况)。这只是为了简单起见吗?thrift --gen java message.thrift
thrift --gen php message.thrift
<?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"