Запрос сервера прерван (H18) на Heroku - PullRequest
0 голосов
/ 07 июня 2019

Поддержка Heroku не очень полезна (за исключением подсказок типа «добавление дополнительных журналов поможет»), поэтому позвольте мне попробовать здесь.

В последнее время мы сталкиваемся с множеством 503. Воспроизвести 503 с помощью curl очень просто:

curl —limit-rate=100 -s -X POST https://our.server.com/some/endpoint?[1-100] \
   --header 'Content-Type: multipart/form-data; boundary=---------BOUNDARY' \
   --data-binary @test.txt

Если test.txt достаточно велик (например, 1 КБ), Heroku вскоре вызовет 503 (кстати, ему даже не нужны данные из нескольких частей). Поэтому я предполагаю, что есть какая-то защита от DDoS, как это происходит даже в нашем простейшем приложении Node.js + Express вместе с приложениями Node моих коллег.

Если это так - есть ли способ замолчать 503 ошибки?

Это стало нас раздражать в последнее время, так как одна из наших конечных точек теперь ожидает составные данные (но я повторюсь - это не обязательно должны быть составные данные, они также воспроизводимы с помощью application / json). Если аутентификация не удалась - мы отправляем 401. Кажется, этого недостаточно, чтобы закрыть многочастный поток?

Что я понимаю, так это то, что Heroku буферизует многочастный поток, что приводит к некоторому переполнению буфера и в результате -> запускает 503.

Код:

(...)
const router = require('express').Router()
// We are getting `401` for the first 10-100 requests, then -> 503 hopes in
router.post('/some/endpoint', async function (req, res, next) {
   return res.status(401).send('Test')
})
app.use('/', router)
(...)

1 Ответ

0 голосов
/ 13 июня 2019

Выяснилось, что причиной сбоя стала очень старая ошибка Node.js (я получил ссылку от Тейлора из службы поддержки Heroku). Очевидно, это еще не исправлено, за исключением полной обработки входящего потока.

...