Рассмотрим, например, веб-службу, где пользователь может сделать запрос API для запуска задачи в определенное запланированное время. Определение задачи и запланированное время сохраняются в базе данных. Первый подход, который я придумал, - запустить таймер Go и подождать, пока таймер истечет в горутине (не блокируя запрос). Эта горутина по истечении времени также запустит другой запрос API, чтобы начать выполнение задачи.
Теперь проблема возникает при повторном развертывании этой службы. Для развертывания без простоев я использую Einhorn с goji. После перезагрузки кода, очевидно, горутина-таймер и горутина-обработчик истечения срока действия таймера умирают. Есть ли способ восстановить таймер Go после перезагрузки кода?
Другая проблема, с которой я борюсь, - это позволить пользователю прервать таймер (после его запуска). У таймера перехода есть Stop, чтобы облегчить это. Но поскольку это API без сохранения состояния, когда запрос \interrupt
поступает в службу, не имеет контекста канала таймера. И кажется, что невозможно маршалировать канал (возвращенный из NewTimer) на диск / db.
Также вполне возможно, что я не смотрю на проблему с правильной точки зрения. Любые предложения будут очень признательны.