С философией Discourses 1RTT я думаю, что, возможно, пришло время переписать код отдачи изображений аватаров.
Изображения аватаров должны обрабатываться как любые другие загружаемые изображения: изменяться в размерах при загрузке, сохраняться и отдаваться напрямую из файловой системы/S3/CDN.
Текущий метод Discourse использует прокси-подход для отдачи изображений аватаров. Такой подход создаёт лишние HTTP-круговые запросы и проблемы с IP-адресами.
Вот обзор запросов к аватарам:
- Отрисовывается начальный HTML-код Discourse.
- Браузер обнаруживает изображение аватара и запрашивает его у сервера Discourse.
- Сервер Discourse выступает в роли прокси и запрашивает изображение из локального хранилища файлов/S3/CDN.
- Сервер Discourse получает изображение.
- Сервер Discourse отправляет изображение в браузер.
Для каждого пользовательского аватара требуется один дополнительный HTTP-круговой запрос и соответствующее время обработки на сервере. Типичная тема или список тем могут содержать более 30 пользовательских изображений аватаров. На моём сайте это приводит к 10 000–20 000 дополнительных RTT и связанной с этим нагрузке на сервер в день, которых можно избежать.
Кроме того, изображения аватаров запрашиваются напрямую с сервера. Для реализации защиты на уровне CDN необходимо добавлять IP-адреса в белый список. Это требует добавления в белый список шлюзов, а не IP-адресов серверов. Хостинг-компании регулярно вносят изменения для балансировки сетевого трафика. Мой IP-адрес шлюза будет меняться/эволюционировать. Программное обеспечение не должно зависеть от обновления IP-адреса для корректной работы базовых изображений аватаров. Это основано на следующем инциденте в поддержке: Avatar Proxy and CDN Hot-Link Protection.
С точки зрения производительности и простоты, можем ли мы обеспечить отдачу изображений аватаров напрямую из назначенного файлового хранилища Discourse?