Вы правы.В вашей архитектуре вам нужен какой-то механизм для блокировки счетчика current-file
, чтобы только один процесс за раз мог изменить его значение.Вы хотите иметь возможность применить мьютекс или блокировку к файлу, когда один процесс открывает его, чтобы увеличить его, чтобы другой процесс не смог увеличить его одновременно.
Я рекомендую рассмотреть альтернативные подходы.
Даже если вы сможете заблокировать счетчик, ваши «работники» будут блокировать, ожидая своей очереди увеличить эту переменную, когда они смогут продолжить обработку файлов.Вы также ограничиваете обработку одним файлом в тот момент, когда ваши процессы могут более эффективно захватывать пакеты файлов за раз.
Существуют различные подходы, которые вы должны рассмотреть.
Если ваш набор файлов предопределен, то есть у вас всегда есть 50k.Когда вы начинаете, вы можете решить, сколько работников вы хотите использовать, а затем дать каждому из них часть решаемой проблемы.Если вы выбрали 1000 рабочих, первому можно присвоить 1.txt..50.txt, второму 51.txt..99.txt и т. Д. Если в файлах есть пробелы, рабочий пропустит отсутствующий файл.
В более сложном сценарии, когда файлы создаются в корзине случайным образом и постоянно, обычной практикой является постановка в очередь обработки.Взгляните на Очереди задач и Cloud Pub / Sub .При таком подходе вы отслеживаете файлы по мере их поступления.Для каждого файла вы ставите в очередь задание на его обработку.Обе задачи очереди и Pub / Sub вы можете создавать push или pull очереди.При любом подходе вы пишете работника, который принимает задания (файлы) из очереди, обрабатывает их и что-то делает с обработанным файлом.Этот подход имеет 2 преимущества по сравнению с более простым случаем: во-первых, вы можете динамически увеличивать | уменьшать количество рабочих на основе глубины очереди (количество файлов, которые нужно обработать).Во-вторых, в случае сбоя работника он не возьмет задание из очереди, поэтому другой работник может заменить его и завершить обработку файла.
Вы можете переместить обработанные файлы в «обработанное» ведро.отслеживать завершение.Таким образом, если ваша работа не удалась, вам нужно перезапустить только с файлами, которые еще не были обработаны.
Наконец, вместо того, чтобы создавать экземпляры один за другим, посмотрите на автоматическое масштабирование с помощью ManagedГруппы экземпляров или, возможно, рассмотрите возможность использования Kubernetes.Обе эти технологии помогают вам клонировать много похожих процессов из одного шаблона.Хотя ни одно из этих решений не решит вашу проблему с координацией, любое из них поможет вам управлять всеми работниками.
Надеюсь, это поможет!