Что будут делать обычные веб-серверы, когда пользователь отменит запрос? - PullRequest
1 голос
/ 09 мая 2011

Для запроса с не очень коротким периодом, и пользователь отменил соединение (то есть он / она закрыл браузер до того, как запрос будет завершен), что тогда произойдет на стороне сервера?

Хотя это должно зависеть от сервера. Но каков будет общий путь?

Некоторым запросам требуется довольно много времени для завершения, например, распределенной транзакции СУБД, которая передает данные на несколько разных серверов в разных странах. (Я знаю, что это очень часто встречается в банковских приложениях)

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

Должен ли он отменить поток запроса после определенного времени ожидания?

Если мое веб-приложение позаботится об активности пользователя и сам отменит транзакцию следующим образом:

service(request, response):
    tx_start();
    do {
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;
        do_some_work()
        if (user_canceled) break;

        tx_commit();
        return;
    } while (false);
    tx_rollback();
    throw new CanceledException();
}

я должен?

1 Ответ

0 голосов
/ 09 мая 2011

Проблема:

  • Если do_some_work () занимает больше времени, чем ожидалось, и клиентское соединение прервалось, do_some_work () может продолжиться, когда транзакция больше не нужна.

Решения:

  • Разделение работы транзакции сервера и ввода клиента с использованием другого потока.
  • Позволяет клиенту прерывать do_all_work (), которая затем генерирует CanceledException.
service(request, response) {  
  try {  
    client_start(request);  
    tx_start();
    do_all_work();
    tx_commit();  
  } catch(CanceledException ce) {  
    tx_rollback();  
    throw ce;
  } finally { 
    client_join();  
  }
}

client_start(request) {
  client = new Client(request);
  client_thread = new Thread(client).start();
}

client_join() {
  client_thread.join(1000); // wait 1s for the client thread to end  
}

...