Add retry logic for database connection and graceful Redis handling
- Retry database connection 5 times with exponential backoff - Allow app to start even if Redis is unavailable - Improves startup reliability in container environments 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
"github.com/treytartt/mycrib-api/internal/config"
|
"github.com/treytartt/mycrib-api/internal/config"
|
||||||
"github.com/treytartt/mycrib-api/internal/database"
|
"github.com/treytartt/mycrib-api/internal/database"
|
||||||
@@ -34,10 +35,18 @@ func main() {
|
|||||||
Int("port", cfg.Server.Port).
|
Int("port", cfg.Server.Port).
|
||||||
Msg("Starting MyCrib API server")
|
Msg("Starting MyCrib API server")
|
||||||
|
|
||||||
// Connect to database
|
// Connect to database (retry with backoff)
|
||||||
db, err := database.Connect(&cfg.Database, cfg.Server.Debug)
|
var db *gorm.DB
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
db, err = database.Connect(&cfg.Database, cfg.Server.Debug)
|
||||||
|
if err == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
log.Warn().Err(err).Int("attempt", i+1).Msg("Failed to connect to database, retrying...")
|
||||||
|
time.Sleep(time.Duration(i+1) * 2 * time.Second)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal().Err(err).Msg("Failed to connect to database")
|
log.Fatal().Err(err).Msg("Failed to connect to database after retries")
|
||||||
}
|
}
|
||||||
defer database.Close()
|
defer database.Close()
|
||||||
|
|
||||||
@@ -46,12 +55,15 @@ func main() {
|
|||||||
log.Fatal().Err(err).Msg("Failed to run database migrations")
|
log.Fatal().Err(err).Msg("Failed to run database migrations")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect to Redis
|
// Connect to Redis (optional - don't fail if unavailable)
|
||||||
cache, err := services.NewCacheService(&cfg.Redis)
|
var cache *services.CacheService
|
||||||
|
cache, err = services.NewCacheService(&cfg.Redis)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal().Err(err).Msg("Failed to connect to Redis")
|
log.Warn().Err(err).Msg("Failed to connect to Redis - caching disabled")
|
||||||
|
cache = nil
|
||||||
|
} else {
|
||||||
|
defer cache.Close()
|
||||||
}
|
}
|
||||||
defer cache.Close()
|
|
||||||
|
|
||||||
// Initialize email service
|
// Initialize email service
|
||||||
var emailService *services.EmailService
|
var emailService *services.EmailService
|
||||||
|
|||||||
Reference in New Issue
Block a user