Я разрабатываю облачное приложение и мне нужен рабочий процесс, который просматривает мою базу данных в поисках работы, а затем выполняет ее.
Большая часть информации, которую я, похоже, нахожу по теме фоновых задач в облакевключает в себя какой-то планировщик и / или систему очередей.
То, что у меня есть, не совсем вписывается в модели «запускать эту задачу каждые 5 минут» или «добавлять это в очередь для последующего выполнения».Я думаю, что основное отличие от моей проблемы заключается в том, что сами работники находят работу, а не назначаются ей периодическим планировщиком или внешним процессом, который генерирует работу.
То, что у меня есть, - это в основном гигантская таблица, гдекаждая запись имеет три поля:
job
: небольшая задача, которую нужно выполнить, скажем, она получает последнее сообщение из учетной записи Twitter и сохраняет его в базе данных interval
для выполнения этой работы: скажем, каждые 5 минут, NB, интервал является произвольным и отличается для каждой записи в таблице - последней
date
, когда задание было выполнено
Способ, которым я бы это реализовал, - иметь работника с бесконечным циклом.Когда он входит в цикл, он просматривает базу данных a) ищет элементы, у которых date + interval < currentTime
, b) когда он их находит, он устанавливает date = currentTime
, и c) затем выполняет задание.Если нет работающего банкомата, он спит несколько секунд, а затем пытается снова.
У меня будет много параллельных рабочих, которые будут одновременно обрабатывать базу данных, поэтому сначала я делаю б), а затем в) в параграфе.выше.Поскольку есть параллельные рабочие, действия a) и b) являются атомарными операциями в базе данных, чтобы предотвратить дублирование работы.Если работник выходит из строя после а) и б), но до того, как ему удается закончить работу, это не страшно, и рабочие могут просто сделать это в следующий интервал;Причина этого заключается в том, что работа не выполняется в системе, не зависящей от времени, поэтому сценарий отставания невыполненных заданий не дает никаких преимуществ, поскольку задачи должны выполняться с их точными интервалами, поэтому лучше пропустить 1 интервал, чем иметь неравные интервалы.между которыми выполнялись задачи.
Мой вопрос: является ли это разумной стратегией реализации?Если да, то как мне реализовать этот процесс в облаке (я использую Heroku, но в будущем могу перейти на EC2)?Я до сих пор не написал никакого кода, поэтому буду рад другим предложениям (может быть, я неправильно понял варианты использования / приложения для систем очередей).