mirror of
https://github.com/EZ-Api/ez-api.git
synced 2026-01-13 17:47:51 +00:00
feat(core): implement sync outbox mechanism and refactor provider validation
- Introduce `SyncOutboxService` and model to retry failed CP-to-Redis sync operations - Update `SyncService` to handle sync failures by enqueuing tasks to the outbox - Centralize provider group and API key validation logic into `ProviderGroupManager` - Refactor API handlers to utilize the new manager and robust sync methods - Add configuration options for sync outbox (interval, batch size, retries)
This commit is contained in:
@@ -135,7 +135,7 @@ func main() {
|
||||
|
||||
// Auto Migrate
|
||||
if logDB != db {
|
||||
if err := db.AutoMigrate(&model.Master{}, &model.Key{}, &model.ProviderGroup{}, &model.APIKey{}, &model.Model{}, &model.Binding{}, &model.Namespace{}, &model.OperationLog{}); err != nil {
|
||||
if err := db.AutoMigrate(&model.Master{}, &model.Key{}, &model.ProviderGroup{}, &model.APIKey{}, &model.Model{}, &model.Binding{}, &model.Namespace{}, &model.OperationLog{}, &model.SyncOutbox{}); err != nil {
|
||||
fatal(logger, "failed to auto migrate", "err", err)
|
||||
}
|
||||
if err := logDB.AutoMigrate(&model.LogRecord{}); err != nil {
|
||||
@@ -145,7 +145,7 @@ func main() {
|
||||
fatal(logger, "failed to ensure log indexes", "err", err)
|
||||
}
|
||||
} else {
|
||||
if err := db.AutoMigrate(&model.Master{}, &model.Key{}, &model.ProviderGroup{}, &model.APIKey{}, &model.Model{}, &model.Binding{}, &model.Namespace{}, &model.OperationLog{}, &model.LogRecord{}); err != nil {
|
||||
if err := db.AutoMigrate(&model.Master{}, &model.Key{}, &model.ProviderGroup{}, &model.APIKey{}, &model.Model{}, &model.Binding{}, &model.Namespace{}, &model.OperationLog{}, &model.LogRecord{}, &model.SyncOutbox{}); err != nil {
|
||||
fatal(logger, "failed to auto migrate", "err", err)
|
||||
}
|
||||
if err := service.EnsureLogIndexes(db); err != nil {
|
||||
@@ -155,6 +155,19 @@ func main() {
|
||||
|
||||
// 4. Setup Services and Handlers
|
||||
syncService := service.NewSyncService(rdb)
|
||||
if cfg.SyncOutbox.Enabled {
|
||||
outboxCfg := service.SyncOutboxConfig{
|
||||
Enabled: cfg.SyncOutbox.Enabled,
|
||||
Interval: time.Duration(cfg.SyncOutbox.IntervalSeconds) * time.Second,
|
||||
BatchSize: cfg.SyncOutbox.BatchSize,
|
||||
MaxRetries: cfg.SyncOutbox.MaxRetries,
|
||||
}
|
||||
outboxService := service.NewSyncOutboxService(db, syncService, outboxCfg, logger)
|
||||
syncService.SetOutbox(outboxService)
|
||||
outboxCtx, cancelOutbox := context.WithCancel(context.Background())
|
||||
defer cancelOutbox()
|
||||
go outboxService.Start(outboxCtx)
|
||||
}
|
||||
logPartitioner := service.NewLogPartitioner(logDB, cfg.Log.Partitioning)
|
||||
if logPartitioner.Enabled() {
|
||||
if _, err := logPartitioner.EnsurePartitionFor(time.Now().UTC()); err != nil {
|
||||
@@ -406,7 +419,7 @@ func runImport(logger *slog.Logger, args []string) int {
|
||||
return 1
|
||||
}
|
||||
|
||||
if err := db.AutoMigrate(&model.Master{}, &model.Key{}, &model.ProviderGroup{}, &model.APIKey{}, &model.Model{}, &model.Binding{}, &model.Namespace{}); err != nil {
|
||||
if err := db.AutoMigrate(&model.Master{}, &model.Key{}, &model.ProviderGroup{}, &model.APIKey{}, &model.Model{}, &model.Binding{}, &model.Namespace{}, &model.SyncOutbox{}); err != nil {
|
||||
logger.Error("failed to auto migrate", "err", err)
|
||||
return 1
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user