Fix tg bot graceful shutdown

This commit is contained in:
2025-08-14 10:46:06 +03:00
parent a284e3ef29
commit 85db17b131
2 changed files with 40 additions and 12 deletions

29
main.go
View File

@@ -30,6 +30,13 @@ import (
sloggin "github.com/samber/slog-gin"
)
const (
TelegramUpdateTimeout = 10
ServerShutdownTimeout = 5
ForceShutdownTimeout = 20
)
func main() {
// Создаем структурированный логгер
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
@@ -101,8 +108,13 @@ func main() {
// Создаем WaitGroup для ожидания завершения всех воркеров
var wg sync.WaitGroup
tgConfig := tgcontroller.TelegramConfig{
BotToken: os.Getenv("TELEGRAM_BOT_TOKEN"),
UpdateTimeout: TelegramUpdateTimeout,
}
// Создаем Telegram бот
tgController, err := tgcontroller.NewTelegramController(transcribeService, jobRepo, logger)
tgController, err := tgcontroller.NewTelegramController(tgConfig, transcribeService, jobRepo, logger)
if err != nil {
logger.Error("Failed to create Telegram controller", "error", err)
// Не останавливаем приложение, если Telegram бот не создан
@@ -113,10 +125,8 @@ func main() {
defer wg.Done()
logger.Info("Starting Telegram bot")
tgController.Start()
logger.Info("Telegram bot stopped")
}()
// Добавляем функцию остановки бота в контекст завершения
defer tgController.Stop()
}
// Создаем воркеры
@@ -198,8 +208,13 @@ func main() {
<-sigChan
logger.Info("Received shutdown signal, initiating graceful shutdown...")
if tgController != nil {
logger.Info("Shutting down Telegram bot...")
tgController.Stop()
}
// Создаем контекст с таймаутом для graceful shutdown HTTP сервера
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 5*time.Second)
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), ServerShutdownTimeout*time.Second)
defer shutdownCancel()
// Останавливаем HTTP сервер
@@ -220,11 +235,11 @@ func main() {
close(done)
}()
// Ждем завершения всех воркеров или таймаута в 10 секунд
// Ждем завершения всех воркеров или таймаута
select {
case <-done:
logger.Info("All workers stopped gracefully")
case <-time.After(10 * time.Second):
case <-time.After(ForceShutdownTimeout * time.Second):
logger.Warn("Timeout reached, forcing shutdown")
}