> Возможно, эффективным решением для соединения бэкэндов было бы
> фиксированное количество соединений, бесконечный keepalive и
> pipelining
Да, мы сделали свой pool keepalive сокетов, это действительно помогает.
pipelining мы хотели сделать, но Nginx его не поддерживает, мы гоняем запросы между бекендами через Nginx, потому что нужен кеш Nginx и балансировка запросов между бекендами.
Для наших задач (возможно и не только для наших) подходит memcache протокол, он очень простой, ответы имеют id - это uri запроса, мультиплицировать его очень просто.
Я поискал сторонние модули, но они не умеет принимать входящие memcache запросы.
Было бы очень круто, если бы в Nginx была возможность что-то вроде этого
location /
{
proxy_cache_pass localhost:11211; # address memcached server socket
}
Тогда клиентcий код станет гениально простым :)
memcached->connect("localhost:11211")
создания соединения с Nginx для общения по протоколу memcached
memcached->get($uri)
запрос принимает Nginx, ищет ответ в своем кеше, ключ запроса равен ключу кеша, если в кеше ответа нет, этот запрос отправляется на бекенд, проксирования на бекенд такое же если бы этот запрос пришел от браузера по НТТР, т.е GET uri HTTP/1.1
Я понимаю, что это похоже на извращения, но поверьте разработчики бекендов оценят это и очень быстро и появится много статей как использовать Nginx вместо Memcache.