Как бороться с тем, что клиент не узнает о смене состояния сервера из-за таймаута?

Есть некоторое апи, которым пользуются мобильные клиенты.
Допустим у клиента плохая связь, он делает запрос к методу апи, сервер обрабатывает запрос и отдает ответ.
В этот момент у клиента испортилась связь и запрос завершается ошибкой по таймауту - он не узнает о смене состояния сервера (допустим делает что-то в случае успеха запроса).
Как решать проблему? Подтверждение получения клиентом?
  • Вопрос задан
  • 387 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
При проектировании API необходимо предусмотреть, что бы все методы изменяющие состояние на сервере были безопасны для повторного вызова.
Делать это можно по сути 2мя способами, в зависимости от изменяемых данных и бизнес-логики.
1) При постинге комментариев можно например тупо проверять на сервере что последний комментарий от этого юзера не совпадает с новым.
2) Более универсально - делать все в 2 приема: первым запросом отправляем что нужно сделать, получаем в ответ некий id запроса. 2м запросом передаем этот id подтверждая что запрос нужно исполнить.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
max-kuznetsov
@max-kuznetsov
Главный IT-архитектор
Ещё как вариант рассмотрите возможность асинхронного выполнения операций на сервере. Нужно организовать два-три метода в API. Первый метод запускает процесс изменения состояния (с валидацией текущего состояния и возможности его изменения) и не требует обязательного возврата результата. Второй метод (не обязательный) возвращает прогресс изменения состояния сервера. Третий - возвращает результат - текущее состояние сервера. В этом случае даже если на один из запросов не придёт ответа, клиент может запрос повторить.
Ответ написан
Комментировать
Vityarik
@Vityarik
Если нет ответа от сервер то считать операцию не выполненной и пробовать все сначала.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Клиент генерирует UUID транзакции и отправляет ее на сервер.
Допустим она выполнялась долго и клиент схватил 500-ю. В этом случае клиент запрашивает (отдельный API метод) статус транзакции (UUID ее он знает). Если получает "все ок" - все ок)). Если ошибку: запрашивает отмену своей транзакции. Если 500-ю - пытается отменить транзакцию, выполняя запросы с экспоненциальной задержкой, пока не получит ответ: да, отменили мы твою транзакцию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы