запрос на получение случайным образом зависает с приложением, поддерживающим реакцию - PullRequest
4 голосов
/ 14 июля 2020

На днях я заметил, что некоторые вызовы API из приложения незаметно не выполняются. Я вышел из console.log до и после запроса fetch, и вот, ожидание при выборке так и не завершилось.

// in an async js function...

let response;
try {
   console.log("START")
   response = await fetch(url, { headers, method, body });
   console.log("END")
} catch (err) {
   console.log(err)
}  

Будет ли завершено sh?

В журналах приложения я вижу «НАЧАТЬ», но затем я жду 2-5 минут, и обычно печатает «КОНЕЦ»

Это сервер?

Я подозревал, что это просто медленный серверный API, но, отслеживая журналы на сервере, запрос даже не отправляется в течение ~ 2 минут после «START» - и я вижу, что он отправляется / обрабатывается, когда он выводит «END»

У меня есть actioncable, подключенный к Redis, установленный в моем приложении Rails, обслуживаемый через Puma на Heroku.

Могу ли я воспроизвести это?

Это было очень сложно воспроизвести, но я могу обычно вызвать его, нажав command + R в приложении iOS simulator, который перезагружает приложение и запускает несколько новых запросов API, которые зависают.

Что-нибудь еще?

У меня есть websock et соединение открыто с сервером. Не уверен, что это может вызвать какие-либо помехи.

Я пробовал использовать тайм-аут с AbortController, но он просто ждет 5 секунд, а затем убивает запрос (но новые запросы не выполняются)

Один раз он запускается, каждый запрос API зависает.

Мои вопросы

  • Есть ли хороший способ отладить это?
  • Есть что-то, что может быть в очереди запросы на выборку в фоновом режиме, о которых я не знаю?

ОБНОВЛЕНИЕ: Хорошо, может это мой сервер ...? Я попытался изменить URL-адрес на другой веб-сайт, и похоже, что запросы завершаются. **

ОБНОВЛЕНИЕ: Хорошо, я думаю, это сервер. Я попробовал запрос curl и traceroute, и они показали, что что-то сильно зависает ...

результаты трассировки

traceroute to us-east-1-a.route.herokuapp.com (127.0.0.54), 64 hops max, 52 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
(it never ends)

curl результаты

curl -v https://redacted.herokuapp.com/v3/users/me
*   Trying 127.0.0.54...
* TCP_NODELAY set
* Connection failed
* connect to 127.0.0.54 port 443 failed: Operation timed out
* Failed to connect to redacted.herokuapp.com port 443: Operation timed out
* Closing connection 0
curl: (7) Failed to connect to redacted.herokuapp.com port 443: Operation timed out

Обновление: Это становится все более и более странным. Я выключил симулятор iOS и дал компьютеру отдохнуть 10 минут. Вернулся и просто попробовал простые запросы curl, и это сработало. Запустил резервную копию симулятора iOS, и теперь мой curl запрашивает таймаут.

Обновление: Я подозреваю, что это связано с запросами блокировки actioncable на Heroku. Попытка отключить все веб-сокеты и повторить тест.

Обновление: Чтобы узнать, было ли это спецификацией приложения c, я создал совершенно новое приложение React Native и совершенно новый Rails API.

Шаги API

  • rails new my_api --api
  • удалить sqlite3 и добавить в pg gem
  • обновленный database.yml
  • добавить «здоровье» status ok конечная точка (контроллер + маршрут)
  • развернуть на heroku

Шаги для мобильного приложения

  • создать новое собственное приложение React
  • добавить запрос setInterval в componentDidMount для выборки из API rails
  • поместить console.log до и после ожидания
  • нажать refre sh ("r" ) на консоли, чтобы обновить sh приложение
  • refre sh приложение ~ 10 раз
  • запрос зависает в какой-то момент

Я полная потеря ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...