У меня есть приложение, которое обслуживает артефакты из файлов (страницы из файлов PDF в виде изображений), оригинальные файлы PDF живут на S3 и загружаются на серверы, которые генерируют изображения, когда клиент нажимает на один из них. Эти машины имеют локальный механизм кэширования, который гарантирует, что каждый файл PDF загружается только один раз.
Итак, когда клиент приходит с запросом , дайте мне страницу 1 из pdf 123.pdf этот кеш проверяется, если там нет файла pdf, он загружается с S3 и сохраняется в локальной кеш, а затем процесс генерирует эту страницу 1 и отправляет изображение обратно клиенту.
Клиент сам не знает, что он подключен к специальному серверу, все выглядит так, как будто он просто обращается к серверу веб-сайта, но ради производительности я хотел бы убедиться, что этот клиент всегда будет направлен на тот же файловый сервер, который обработал свой первый запрос (и загрузил файл с S3).
Я мог бы просто установить cookie на клиенте, чтобы он всегда загружал с этого конкретного файлового сервера, но размещение его на клиенте ведет к несправедливому использованию, поскольку некоторые пользователи собираются открывать много документов, а некоторые нет, хотел бы выполнить балансировку нагрузки на уровне ресурсов (документ PDF).
Каждый документ имеет уникальный идентификатор (целочисленный первичный ключ в базе данных), и моим первым решением было использование Redis и сохранение идентификатора документа в качестве ключа, а значение - это хост сервера, на котором в данный момент этот документ кэширован, но Я хотел бы удалить Redis или искать более простой способ реализации этого, который не требовал бы поиска ключей где-либо еще.
Кроме того, было бы неплохо, если бы определенный алгоритм или идея позволили добавлять больше файловых серверов на лету.
Каков наилучший способ для балансировки нагрузки такого типа с привязкой к ресурсам?
Просто ради того, чтобы сказать, это приложение представляет собой смесь Ruby, Java и Scala.