Состояние гонки Docker, приводящее к ошибке curl «передача завершена, осталось прочитать 1 байт»

Трудно полностью описать нашу проблему. Однако я постараюсь предоставить полную информацию. Я провел много часов и все еще застрял. Надеюсь, что кто-нибудь здесь может мне помочь.

В настоящее время наш контейнер случайным образом зависает при ответе на сетевой запрос.

У меня есть приложение nodejs, работающее на порту 8082, этот порт также доступен для хост-машины. Я создал мостовую сеть, чтобы связать ее с прокси-контейнером nginx.

Я написал сценарий для выполнения следующих действий

  • остановить контейнер nodejs
  • запустить новый контейнер nodejs (из того же или более нового образа)
  • удалить сеть
  • остановить контейнер nginx
  • создать новый сеть
  • связывает nodejs с новой сетью
  • запускает другой контейнер nginx, используя с новой сетью

Иногда этот дизайн работает отлично. Однако иногда он ломается случайно . Разрыв происходит сразу после запуска контейнера, и как только он сломан, он не работает для всех запросов.

Вот как это происходит.

  • Если я запустил curl localhost: 8082 на хост-машине, он вернет Найдено. Перенаправление на / en . Это верно.
  • Если я запустил на хост-компьютере curl localhost: 8082 / en , он надолго зависнет и вернет curl: (52) Пустой ответ от сервера .
  • На хост-машине я запускаю docker exec 041fe684edfb curl localhost: 8082 / en (041fe684edfb - имя контейнера), он возвращает 99% ответа и зависает при печати , затем возвращает curl: (18) передача закрыта с 1 байтом, оставшимся для чтения .
  • Если я запускаю docker exec -it 041fe684edfb bash , а затем запускаю curl localhost: 8082 / en в контейнерном терминале, он печатает ответ, зависает, но в другом (последнем) позиция
    <script defer src="https://d3l80sdjn9d1ye.cloudfront.net/bundles/runtime.93923d84c7f89f7844ae.js"></script>
    <script defer src="https://d3l80sdjn9d1ye.cloudfront.net/bundles/admin-car-calendar~admin-host~admin-orders~admin-station~admin-stations~author-postView~holder-car-c~b1a1af4b.05ea0cbf23227e7a323a.js"></script>
    <script defer src="https://d3l80sdjn9d1ye.cloudfront.net/bundles/admin-car-calendar~admin-car-orders~admin-cars~holder-car-calendar~holder-car-simple-calendar~holder~9dc2a71c.5714564e356df216ebb8.js"></script>
    <script defer src="https://d3l80sdjn9d1ye.cloudfront.net/bundles/user-vs-home.dc7ac409e63e95c891ec.js"></script>
    <script defer src="https://d3l80sdjn9d1ye.cloudfront.net/bundles/vendors.284ffc3f329d46200747.js"></script>
    <script defer src="https://d3l80sdjn9d1ye.cloudfront.net/bundles/client.16b9bdc0c6df3c59afb6.js"></script>
    <script defer src="https://d3l80sdjn9d1ye.cloudfront.net/bundles/styles.91c5d85ab779777de531.js"></script>
</body>

не распечатывается.

Когда я проверил журнал своего приложения nodejs, запрос полностью обработал запрос (до ).


Дополнительная информация

  • Если я перезапускаю контейнер с помощью docker restart 041fe684edfb , проблема исчезает
  • Если я запускаю команды сценария одну за другой, проблема исчезает
  • Мое приложение nodejs подключается на внешние серверы mongo и redis по адресу 10.0.81.135 (частный IP-адрес AWS EC2). Изначально эти серверы запускались локально в других контейнерах, никаких проблем не возникало. Проблема возникла после того, как я перенес их на отдельный сервер.
  • Размер блока - 221773. Журнал приложения Nodejs выводит этот размер, а curl правильно интерпретирует заголовок Content-Length .
  • В конце nodejs выдает эту ошибку несколько раз (6 раз), затем завершает работу

12:07:00
AbortError: Redis connection lost and command aborted. It might have been processed.

12:07:00
at RedisClient.flush_and_error (/carstay/node_modules/redis/index.js:362:23)

12:07:00
at RedisClient.connection_gone (/carstay/node_modules/redis/index.js:664:14)

12:07:00
at RedisClient.on_error (/carstay/node_modules/redis/index.js:410:10)

12:07:00
at Socket.<anonymous> (/carstay/node_modules/redis/index.js:279:14)

12:07:00
at Socket.emit (events.js:223:5)

12:07:00
at Socket.EventEmitter.emit (domain.js:475:20)

12:07:00
at emitErrorNT (internal/streams/destroy.js:92:8)

12:07:00
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)

12:07:00
at processTicksAndRejections (internal/process/task_queues.js:81:21)

12:07:00
AbortError: Redis connection lost and command aborted. It might have been processed.

12:07:00
at RedisClient.flush_and_error (/carstay/node_modules/redis/index.js:362:23)

12:07:00
at RedisClient.connection_gone (/carstay/node_modules/redis/index.js:664:14)

12:07:00
at RedisClient.on_error (/carstay/node_modules/redis/index.js:410:10)

12:07:00
at Socket.<anonymous> (/carstay/node_modules/redis/index.js:279:14)

12:07:00
at Socket.emit (events.js:223:5)

12:07:00
at Socket.EventEmitter.emit (domain.js:475:20)

12:07:00
at emitErrorNT (internal/streams/destroy.js:92:8)

12:07:00
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)

12:07:00
at processTicksAndRejections (internal/process/task_queues.js:81:21)
0
задан 22 February 2020 в 08:27
1 ответ

Столкнулся с похожей проблемой и нашел эту статью: https://medium.com/grano/the-fault-in-our-responses-bytes-remaining-to-read -91efe0553676

Пользовательский обработчик ошибок, который вызывает next(), хотя ответ уже был отправлен, вызвал это, поскольку последний next() является обработчиком по умолчанию из Express, который немедленно отключит сокет. Тем временем Redis все еще может попытаться сохранить вашу сессию и умереть.

Попробуйте выполнить свой код и посмотрите, обслуживается ли запрос несколько раз при определенных обстоятельствах, например. если в какой-то момент возникает ошибка. Даже res.send() может вызвать ошибку, например. если вы попытаетесь отправить данные, которые не могут быть сериализованы.

0
ответ дан 13 January 2021 в 08:22

Теги

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