Apache Thrift: проблемы времени ожидания клиента - PullRequest
11 голосов
/ 19 мая 2011

У меня есть тестовое приложение Apache Thrift (v.0.6.1) с perl-сервером и php-клиентом.

Поведение, которое я не могу объяснить: если мы вызываем метод server с недопустимым аргументом, мы видим ошибку в выходных данных сервера, но php-клиент остается в ожидании ответа бесконечно.

Вот источники сервера:

sub new {
    my $classname = shift;
    my $self      = {};

    return bless($self,$classname);
}

sub DateToTimestamp
{
    my ($self, $date) = @_;
    my $result = CommonAPI::DateToTimestamp($date);
    return $result;
}

eval {
  my $handler       = new RPCHandler;
  my $processor     = new RPCPerformanceTest::RPCPerformanceTestProcessor($handler);
  my $serversocket  = new Thrift::ServerSocket(9091);
  my $forkingserver = new Thrift::ForkingServer($processor, $serversocket);
  print "Starting the server...\n";
  $forkingserver->serve();
  print "done.\n";
}; if ($@) {
  if ($@ =~ m/TException/ and exists $@->{message}) {
    my $message = $@->{message};
    my $code    = $@->{code};
    my $out     = $code . ':' . $message;
    die $out;
  } else {
    die $@;
  }
}

и клиент:

try {

    $socket = new TSocket($server_host, $server_port);

    $transport = new TBufferedTransport($socket, 1024, 1024);
    $protocol = new TBinaryProtocol($transport);

    $client = new RPCPerformanceTestClient($protocol);
    $transport->open();

    $start = microtime(true);

    $result = $client->DateToTimestamp('071/26/2011 01:23:45');

    var_dump($result);

} catch (Exception $e) {
    echo 'Exception: <b>' . $e->getMessage() . '</b>';
}

Почему это происходит? Это моя вина? Это ожидаемое поведение?

Ответы [ 2 ]

6 голосов
/ 06 декабря 2012

Библиотека Thrift PHP немного не работает. Вам нужно вручную установить время ожидания Э.Г.

  $socket = new TSocket('host', 9095);
  $socket->setSendTimeout(60000);
  $socket->setRecvTimeout(60000)
1 голос
/ 30 мая 2011

Это часто случается с протоколами, которые не предоставляют длину сообщения: клиент отправляет больше данных, чем сервер ожидает, и ждет, пока сервер получит данные. Сервер получает некоторые данные, пытается их проанализировать и дает сбой. Теперь серверная часть протокола находится в состоянии ошибки. Если он продолжает читать данные, он может заблокироваться. Скорее всего, серверная сторона отправила вам какой-то ответ об ошибке и в то же время ожидает, пока клиент получит ответ, но этого тоже не произойдет.

Это мое предположение. Наилучшая стратегия IMHO - установить тайм-аут для клиентских и серверных сокетов.

...