@Danbka

Как поставить приложение «на паузу»?

Привет!

Упрощенно:
Есть golang приложение, которое по http получает данные с внешнего сервера раз в секунду, как-то их обрабатывает и отправляет назад.

Если при получении данных сервер возвращает код 500, то необходимо поставить "приложение на паузу": перестать обрабатывать уже полученные данные и отсылать обработанные назад на сервер (технически это будет значить очистку буферизованных каналов и данных, которые уже крутятся внутри приложения).

Как только ответ от сервера приходит 200 - снова все продолжает работать.

Подскажите, пожалуйста, ссылки с примерами, как лучше управлять таким как бы глобальным состоянием приложения.
  • Вопрос задан
  • 230 просмотров
Пригласить эксперта
Ответы на вопрос 3
Vindicar
@Vindicar
RTFM!
Ни разу не писал на Go, но могу задать умный вопрос насчёт архитектуры. =)
Как только ответ от сервера приходит 200 - снова все продолжает работать.

То есть приложение должно продолжать работать, как минимум в плане отправки запросов к серверу! Иначе как оно узнает, что можно работать дальше?

Далее, если я правильно понимаю, что ты в цикле крутишь примерно следующий псевдокод?
while (true) {
    data = query_server();
    result = process_data(data);
    send_result(result);
}

Тогда почему не заставить query_server() сообщать об успешности запроса так или иначе?
А далее, если запрос был успешен, выполнять следующие два шага.
Ответ написан
Комментировать
Неправильно как-то все это.
Если есть запрос, значит, и соединение. Пока ответ не отдан, веб-сервер должен держать соединение. А если ответ не возвращается, то клиент ждет, пока соединение не отвалится по таймауту. Так что эта техника довольно затратна с точки зрения ресурсов, которые могут быть исчерпаны. Особенно, при наличии достаточно большого количества клиентов.
Ну а так, ошибка 500 может означать и логическую, и ошибку соединения с СУБД, и что какой-то ресурс 3-й стороны недоступен, и многое другое. Так что если логическая, то сервер не "исправится" и, при этом, не выйдет из спячки, если будет ждать ответа 200.
Ну а так, блокировать выполнение можно при помощи каналов (channel). Но практический смысл в этом не вижу.
Ответ написан
Комментировать
@darst
Попробуй так
switch request.StatusCode {
case http.StatusOK:
    продолжаешь обработывать
case http.StatusInternalServerError:
    здесь например ставишь таймаут (time.Sleep(2*time.Second)) или как-то ещё тормозишь
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы