У меня есть простой API-интерфейс Falcon REST для запроса POST, который принимает отформатированное тело JSON: { "Input": "input string request" }
и возвращает: { "Output: "output string response" }
Может быть полезно отметить, что в производстве все запросы будут поступать от одного клиента, и эта служба должна быть способна обрабатывать 50 запросов в секунду c со средним временем отклика менее 200 мс. В идеале эти запросы должны выполняться партиями, но, к сожалению, из-за нескольких факторов это нужно делать именно так.
Я обнаружил, что Бьорн (по сравнению с Gunicorn) может обслуживать мое приложение как быстрее всего, так и обрабатывать большую часть нагрузки, прежде чем вызывать тайм-ауты. Вдобавок ко всему это работает Nginx, и мои почти стандартные конфигурации вставлены ниже.
Проблема, с которой я сталкиваюсь, заключается в том, что я вижу около 2% тайм-аута запросов (определяется с помощью инструмента командной строки Linux wrk
), и я думаю, что это связано с загрузкой.
Мне интересно, могу ли я настроить Nginx, чтобы установить лимит времени для ответа клиенту (допустим, 500 мс), и если вышестоящий сервер достигает этого лимита времени до ответа, отправьте значение по умолчанию JSON ответ с пустым JSON ответ: { "Output": "" }
Возможно ли, чтобы все запросы возвращались за указанный максимальный промежуток времени?
Заранее благодарим за уделенное время! :)
/ etc / nginx / nginx .conf:
worker_processes auto;
error_log /app/logs/nginx_error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024; # max connections per worker process
multi_accept on;
use epoll; # efficient connection processing method for linux
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '[$time_local] resp_status=$status req_time=$request_time '
'upstream_header_time=$upstream_header_time';
access_log /app/logs/nginx_access.log main buffer=500k flush=5m;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 65; # how long to keep an idle connection alive
#keepalive_requests 50;
# proxy_connect_timeout 400ms;
# proxy_send_timeout 400ms;
# proxy_read_timeout 400ms;
# send_timeout 500ms;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
/ etc / nginx / conf.d / app.conf
upstream app_servers {
server 0.0.0.0:5000;
}
server {
listen 8000;
server_name localhost;
location / {
proxy_pass http://app_servers;
# error_page 502 timeout_502;
# error_page 504 timeout_502;
}
# location timeout_502 {
# #default_type application/json;
# return 204 '{"Output": ""}';
# }
}