Я запускаю пару клиентских и серверных программ, обменивающихся с помощью Apache Thrift на моем Mac. В нашей производственной системе мы можем оказаться в ситуации, когда клиент использует TJSONProtocol
, а сервер использует TBinaryProtocol
для сериализации и десериализации.Как обнаружить несоответствие протокола при использовании Apache Thrift?
Я знаю, что это ужасная вещь. Но я не уверен, как это обнаружить раньше. Я попробовал образец программы с различными протоколами. Я ожидал получить исключение, но клиент застрял в вызове 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
печатать. Есть ли способ обнаружить эту несовместимость без застревания?
О, это очень плохо. Я хотел бы контролировать, какой протокол я использую динамически при запуске программ, чтобы я мог переключиться на протокол JSON/debug для отладки и Binary для запуска. Меня беспокоит в некоторых случаях во время тестирования, мы можем оказаться в ситуации, когда конфигурация несогласованна, что приводит к несогласованному протоколу. – CCoder
Как насчет использования разных портов для отладки/выпуска? – JensG
Если это предназначено только для отладки, это может быть просто вариант программы (или даже вариант компиляции) - вам редко нужно использовать отладку, а при необходимости просто настраивать среду отладки с другим запущенным клиентом и сервером. – Hcorg