gpt4 book ai didi

thrift - 使用 Apache Thrift 时如何检测协议(protocol)不匹配?

转载 作者:行者123 更新时间:2023-12-01 12:32:59 25 4
gpt4 key购买 nike

我正在我的 Mac 上运行一对使用 Apache Thrift 进行通信的客户端和服务器程序。在我们的生产系统中,我们可能最终会遇到客户端使用TJSONProtocol,服务端使用TBinaryProtocol 进行序列化和反序列化的情况。

我知道这是一件很糟糕的事情。但我不确定如何事先检测到这一点。我尝试了一个具有不同协议(protocol)的示例程序。我原以为会收到异常,但客户端卡在了 RPC 调用上,再也没有返回。

使用 TBinaryProtocol 的服务器代码:

shared_ptr<SomethingHandler> handler(new SomethingHandler());
shared_ptr<TProcessor> processor(new SomethingProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();

使用TJSONProtocol的客户端代码:

boost::shared_ptr < TSocket > socket(new TSocket(argv[1], 9090));
boost::shared_ptr < TTransport > transport(new TBufferedTransport(socket));
boost::shared_ptr < TProtocol > protocol(new TJSONProtocol(transport));
transport->open();
std::cout<<"Transport open success"<<std::endl;
SomethingClient client(protocol);
std::cout<<"Create client success"<<std::endl;
try{
std::cout<<"About to ping"<<std::endl;
client.ping(argv[2]);
std::cout<<"Ping success"<<std::endl;
}catch(TException e){
std::cout<<"Exception occurred:"<<e.what()<<std::endl;
}
transport->close();

在这个例子中,我从未打印过Ping success。有什么方法可以在不卡住的情况下检测到这种不兼容性?

最佳答案

恐怕你做不到。根据定义,您应该在两端设置完全相同的协议(protocol)/传输栈1);其他任何东西都是无效的。

如果您需要不同的协议(protocol)/传输栈,您需要设置适当数量的不同端点。

除了堆栈较高级别的常用机制外,没有任何保护或检测。您卡住的原因很可能是对数据的误解,因此服务器可能只是等待更多请求字节进入,而您没有发送。


1) 该规则有一些异常(exception)情况,但它们在这里无关紧要。

关于thrift - 使用 Apache Thrift 时如何检测协议(protocol)不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31874153/

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