需要解释使用 Thrift rpc 传输二进制数据
可以说我定义了以下 Thrift 服务
service FileResource {
binary get_file(1:string file_name)
}
这是生成的实现,我无法理解
public ByteBuffer recv_get_file() throws org.apache.thrift.TException
{
org.apache.thrift.protocol.TMessage msg = iprot_.readMessageBegin();
if (msg.type == org.apache.thrift.protocol.TMessageType.EXCEPTION) {
org.apache.thrift.TApplicationException x = org.apache.thrift.TApplicationException.read(iprot_);
iprot_.readMessageEnd();
throw x;
}
if (msg.seqid != seqid_) {
throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.BAD_SEQUENCE_ID, "get_file failed: out of sequence response");
}
get_file_result result = new get_file_result();
result.read(iprot_);
iprot_.readMessageEnd();
if (result.isSetSuccess()) {
return result.success;
}
throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_file failed: unknown result");
}
该字符串如何工作
result.read(iprot_);
? 是同步还是异步?它如何处理大数据(几兆字节甚至更多)? 我需要什么来读取这些数据? 不幸的是我不习惯使用 java.nio 和 ByteBuffer。任何示例或指南都会很好。
Lets say I defined following Thrift service
service FileResource {
binary get_file(1:string file_name)
}
Here is the generated implementation which I cannot understand
public ByteBuffer recv_get_file() throws org.apache.thrift.TException
{
org.apache.thrift.protocol.TMessage msg = iprot_.readMessageBegin();
if (msg.type == org.apache.thrift.protocol.TMessageType.EXCEPTION) {
org.apache.thrift.TApplicationException x = org.apache.thrift.TApplicationException.read(iprot_);
iprot_.readMessageEnd();
throw x;
}
if (msg.seqid != seqid_) {
throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.BAD_SEQUENCE_ID, "get_file failed: out of sequence response");
}
get_file_result result = new get_file_result();
result.read(iprot_);
iprot_.readMessageEnd();
if (result.isSetSuccess()) {
return result.success;
}
throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, "get_file failed: unknown result");
}
How works the string
result.read(iprot_);
?
Is it synchronous or asynchronous? How it will work for large data (several megabytes and more)?
And what I need to read those data?
Unfortunately I'm not used to work with java.nio and ByteBuffer. Any examples or guides would be nice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为您误解了 Apache Thrift 的用途。如果这么复杂的话,Java NIO 会更容易......
Thrift 应该负责为您传输这些数据。表现如何?这在很大程度上取决于您的硬件和网络质量。 Thrift 具有相当不错的性能。
在 Java Thrift 客户端中,您可以执行以下操作
如果您在 .thrift 文件中将其定义为
oneway
,则它是异步的,否则它是同步的。因此在你的情况下它是同步的。必须实现网络底层细节完全违背了使用 Thrift 的目的。 Thrift 被精确地使用,因此您可以忘记这个细节。
I think you misunderstood what Apache Thrift is for. If it was this complicated, Java NIO would be easier...
Thrift should care of transporting that data for you. How's the performance? This will highly depend on your hardware and the quality of the network. Thrift has a pretty good performance.
In your Java Thrift client, you can do
If you defined it as
oneway
in the .thrift file, it's asynchronous, otherwise it is synchronous. Thus in your case it is synchronous.Having to implement network low-level details totally beats the purpose of using Thrift. Thrift is precisely used so you can forget about this details.
最后我成功地将文件从服务器传输到客户端。我扩展了 Thrift 自动生成的 Client 和 Processor 类。它让我可以访问 TProtocol 对象。这又允许发送/接收任意数据流。
我确信我的解决方案非常粗糙。如果有人指出我如何按照 Thrift 架构来实现它,那就太好了。通过实现自定义 Thrift 协议是否可以更好地实现这一目标?
客户端:
服务器:
服务器处理程序:
Finally I succeeded in transferring file from server to client. I extended Client and Processor classes auto-generated by Thrift. It gave me access to TProtocol object. Which in turn allows to send/receive arbitrary data streams.
I'm sure my solution is very rough. It would be nice if someone pointed to me how to implement it in conformity with Thrift architecture. Could it be accomplished better by implementing custom Thrift protocol?
client:
server:
server handler: