Я думаю, что вы правы в том, что проблема, которую вы пытаетесь решить, это проблема планирования работы или задачи.
Один из подходов, который используют многие компании, - это система, которую вы предлагаете: задания вставляются в хранилище данных со временем выполнения, а затем это хранилище данных может быть опрошено для запуска заданий. Существуют оптимизации, которые предотвращают дополнительные операции чтения, такие как регулярный опрос базы данных и использование экспоненциального отката. Преимущество этой системы в том, что она терпима к сбоям узла, а недостаток - сложность системы.
Оглядываясь вокруг, в дополнение к той, которую вы связали (https://github.com/gocelery/gocelery), есть и другие реализации этой модели (https://github.com/ajvb/kala или https://github.com/rakanalh/scheduler были те, которые я нашел после быстрого поиска) .
Другой подход, который вы описали, «планирование рабочих мест в процессе» очень прост на ходу, потому что припаркованные подпрограммы очень дешевы. Это просто, чтобы просто запустить goroutine для вашей работы дешево. Это просто, но недостатком является то, что если процесс умирает, работа теряется.
go func() {
<-time.After(expirationTime.Sub(time.Now()))
// do work here.
}()
Последний подход, который я видел, но не рекомендую, - это модель обратного вызова (что-то вроде https://gitlab.com/andreynech/dsched).). Здесь ваша служба вызывает другую службу (через http, grpc и т. Д.) И планирует обратный вызов. на определенное время. Преимущество состоит в том, что если у вас есть несколько служб на разных языках, они могут использовать один и тот же планировщик.
В целом, прежде чем вы примете решение, я бы рассмотрел некоторые компромиссы:
- Насколько приемлема потеря работы? Если все в порядке, что некоторые задания теряются в течение небольшого процента времени, возможно, приемлемо внутрипроцессное решение.
- Как долго будут ждать работы? Если это больше, чем период отключения вашего хоста, возможно, решение на основе хранилища данных будет лучше.
- Вам нужно будет распределить нагрузку на несколько машин? Если вам нужно распределить нагрузку, шардинг и планирование - это сложная задача, и вы можете рассмотреть возможность использования более готового решения.
Удачи! Надеюсь, это поможет.