Минус первого подхода в том что могут возникнуть коллизии и 2 сервера могу взять одновременно задачу на себя и будут выполнять двойную работу
Зависит от технологий, которые Вы собираетесь использовать. У Вас в варианте №1 структура данных с задачами для воркеров будет называться
распределенная очередь (shared queue). У этой структуры данных как раз-таки основная задача - раздавать данные юнитам, предотвращая дублирование и негативные эффекты типа race condition и т.д.
В разных программных пакетах реализуется по-разному. Порекомендую глянуть например на
Beanstalkd, где все Ваши проблемы уже решены, либо воспользоваться встроенной в Redis структурой данных
List. Она в принципе то что нужно и делает.
Однако преимущество Beanstalkd будет в том, что он специально заточен именно под очереди задач: поддерживается сортировка задач в заданном числовом порядке, резервирование задач, автоматическое снятие резерва при превышении времени на обработку и др.
Плюс предусматривает возможность хранения задач на жестком диске (с ключом -b) помимо хранения в памяти (что в Redis реализуется только через слепки (snapshot), либо через полный лог операций - что не есть оптимальный вариант).