У нас есть куча файлов, которые будут загружены в удаленное хранилище blob после обработки.Обработка очереди в очереди с повторением при сбое
В настоящее время интерфейс (PHP) создает redis-список таких файлов и дает ему уникальный идентификатор, называемый JobID. Затем он передает уникальный идентификатор в трубку beanstalk, которая принимается процессом Go. Он использует библиотеку Go workers для обработки каждого идентификатора задания в соответствии с тем, что делает net/http
. Он получает идентификатор задания, извлекает список redis и начинает обработку файлов.
Однако в настоящее время обрабатывается только один файл. Поскольку операция здесь связана с I/O, а не с привязкой к ЦП, интуиция предполагает, что было бы полезно использовать goroutine для каждого файла.
Однако мы хотим повторить загрузку при сбое, а также отслеживать количество обработанных элементов на одно задание. Мы не можем запустить несвязанное количество goroutines, потому что одно Job может содержать около ~ 10k файлов для обработки, и 100s таких Рабочих мест могут быть отправлены в секунду во время пиковых значений. Какой был бы правильный подход для этого?
NB: Мы можем изменить технологию стека немного, если это необходимо (например, замена из beanstalkd для чего-то)
Это помогло мне начать работу по ограничению параллелизм. Однако проблема, которая до сих пор остается в силе, заключается в том, как отслеживать успех или неудачу работы. Задание содержит N подзадач, все из которых должны быть успешно обработаны, а ошибки должны быть отправлены. Как я к этому подхожу? – agathver
Создайте канал, который вы передадите гороходу. Горотин может записать результат операции, включая ошибки на этом канале. Вызывающий может вытащить информацию из этого канала, обрабатывая ошибку при необходимости (например, зарегистрировать ошибку или повторить операцию). Если вам нужно повторить операцию, сделайте канал с настраиваемым типом структуры с необходимым контекстом для повторной попытки (например, вход, который требуется goroutine для повторной попытки) и ошибка. – MahlerFive