2015-08-07 2 views
3

Я запускаю пару клиентских и серверных программ, обменивающихся с помощью 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 печатать. Есть ли способ обнаружить эту несовместимость без застревания?

ответ

4

Боюсь, вы не можете. По определению вы должны установить тот же самый протокол/транспортный стек 1) с обоих концов; все остальное просто недействительно.

Если вам нужны разные протоколы/транспортные стеки, вам необходимо настроить соответствующее количество разных конечных точек.

Нет защиты или обнаружения, кроме обычных механизмов на более высоких уровнях стека. Причина, по которой вы застряли, скорее всего, неверно интерпретирует данные, поэтому сервер, вероятно, просто ждет больше байтов запросов, которые вы не отправляете.


1) Есть некоторые исключения из этого правила, но они не имеют значения здесь.

+1

О, это очень плохо. Я хотел бы контролировать, какой протокол я использую динамически при запуске программ, чтобы я мог переключиться на протокол JSON/debug для отладки и Binary для запуска. Меня беспокоит в некоторых случаях во время тестирования, мы можем оказаться в ситуации, когда конфигурация несогласованна, что приводит к несогласованному протоколу. – CCoder

+1

Как насчет использования разных портов для отладки/выпуска? – JensG

+0

Если это предназначено только для отладки, это может быть просто вариант программы (или даже вариант компиляции) - вам редко нужно использовать отладку, а при необходимости просто настраивать среду отладки с другим запущенным клиентом и сервером. – Hcorg

Смежные вопросы