Я использую Sails.js для API, который я развертываю из Dockerfile в кластере Google Cloud kubernetes и масштабирую рабочую нагрузку с 3-5 модулями. API предоставляет конечные точки для загрузки отдельных файлов изображений и больших ZIP-файлов, которые я непосредственно извлекаю из текущего модуля / экземпляра API.
Как отдельные файлы изображений, так и извлеченный архивный контент (100-1000 файлов со всем вместе 15-85 МБ контента), я должен загрузить в различные хранилища. Это где Redis Kue вступает в игру. Чтобы API не блокировал запрос на загрузку слишком долго, я создаю отложенные задания kue, чтобы переместить все загруженные файлы и папки в сегменты хранения или цепочки заданий и сначала создать эскизы с помощью ImageMagick.
Все это может занять некоторое время, в зависимости от текущей рабочей нагрузки кластера, иногда больше, а иногда и меньше.
Все это работает довольно хорошо с одним экземпляром, но внутри кластера, это другая история. Поскольку экземпляр kubernetes для API может изменяться от запроса к запросу, закачки могут выполняться в экземпляре A , но задание для файлов обрабатывается и обрабатывается экземпляром B ( рабочий, а также сам API-интерфейс выполняются в одном и том же экземпляре!), который может не иметь доступных загрузок, что приводит к неудачной работе.
Google требуется время, чтобы синхронизировать модули и распространять загруженные файлы на все остальные модули.
Я попробовал следующее:
Поскольку имя текущего модуля доступно через переменную env HOSTNAME , я сохраняю HOSTNAME со всеми заданиями kue и проверяю на рабочем месте, если HOSTNAME из заданий совпадает с именем хоста текущей среды и позволяет обрабатывать задания, только если совпадают оба имени хоста.
Загрузка должна быть доступна как можно скорее; почему я не могу добавить задержку на несколько минут и надеюсь, что к тому времени, когда работа будет обработана, Google синхронизирует свои модули.
Ожидающие задания, которые не соответствуют имени хоста, я возвращаюсь в очередь и добавляю к ней задержку.
Мне нужна очередь, которая не должна заботиться об именах хостов и условных проверках для успешной обработки своих заданий в кластере, подобном моему.