Обнаружение сбоя HTTP-запроса на сервере

#http #jakarta-ee #transactions #client-server #distributed-system

#http #джакарта-ee #транзакции #клиент-сервер #распределенная система

Вопрос:

Я разрабатываю HTTP-сервер, который обрабатывает транзакционные запросы от клиентов. Они будут взаимодействовать через крайне ненадежную беспроводную сеть, поэтому я беспокоюсь о согласованности данных в базе данных сервера. Вот как я обрабатываю POST запросы:

 void doPost(request, response)
{
    transaction = newTransaction();
    processBody(request);
    transaction.commit();
}
  

Когда я никогда не получаю запрос, проблем нет. Клиент просто получает, timeout error и транзакция не выполняется. Однако, что произойдет, если ответ будет потерян в сети? Конечно, клиент все равно получит timeout error , но на этот раз транзакция будет завершена на сервере без ведома клиента! Это неудачный случай, с которым мне нужно разобраться.

Итак, мой вопрос: как мне определить, был ли доставлен ответ, и откатить транзакцию в противном случае?

Я кодирую свое серверное приложение, используя JavaEE, и размещаю его на Glassfish.

Ответ №1:

Хорошо, я разобрался с этим. В стеке протоколов HTTP / TCP нет средств для обнаружения отбрасывания ответа. Однако он отлично обрабатывает отбрасывание запроса, так что мне нужно только отправить POST-запрос с сервера клиенту, вот так:

 void doPost(request, response)
{
    transaction = newTransaction();
    try {
        var result = processBody(request);
        sendPOSTToClient(result);
        transaction.commit();
    catch (IOException e) {
        transaction.rollback(); // network partition occured
    }
}