feat: 分组管理内存集群同步缓存
This commit is contained in:
87
internal/services/group_manager.go
Normal file
87
internal/services/group_manager.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gpt-load/internal/errors"
|
||||
"gpt-load/internal/models"
|
||||
"gpt-load/internal/store"
|
||||
"gpt-load/internal/syncer"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const GroupUpdateChannel = "groups:updated"
|
||||
|
||||
// GroupManager manages the caching of group data.
|
||||
type GroupManager struct {
|
||||
syncer *syncer.CacheSyncer[map[string]*models.Group]
|
||||
db *gorm.DB
|
||||
store store.Store
|
||||
}
|
||||
|
||||
// NewGroupManager creates a new, uninitialized GroupManager.
|
||||
func NewGroupManager(db *gorm.DB, store store.Store) *GroupManager {
|
||||
return &GroupManager{
|
||||
db: db,
|
||||
store: store,
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize sets up the CacheSyncer. This is called separately to handle potential
|
||||
func (gm *GroupManager) Initialize() error {
|
||||
loader := func() (map[string]*models.Group, error) {
|
||||
var groups []*models.Group
|
||||
if err := gm.db.Find(&groups).Error; err != nil {
|
||||
return nil, fmt.Errorf("failed to load groups from db: %w", err)
|
||||
}
|
||||
|
||||
groupMap := make(map[string]*models.Group, len(groups))
|
||||
for _, group := range groups {
|
||||
g := *group
|
||||
groupMap[g.Name] = &g
|
||||
}
|
||||
return groupMap, nil
|
||||
}
|
||||
|
||||
syncer, err := syncer.NewCacheSyncer(
|
||||
loader,
|
||||
gm.store,
|
||||
GroupUpdateChannel,
|
||||
logrus.WithField("syncer", "groups"),
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create group syncer: %w", err)
|
||||
}
|
||||
gm.syncer = syncer
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetGroupByName retrieves a single group by its name from the cache.
|
||||
func (gm *GroupManager) GetGroupByName(name string) (*models.Group, error) {
|
||||
if gm.syncer == nil {
|
||||
return nil, fmt.Errorf("GroupManager is not initialized")
|
||||
}
|
||||
|
||||
groups := gm.syncer.Get()
|
||||
group, ok := groups[name]
|
||||
if !ok {
|
||||
return nil, errors.ErrResourceNotFound
|
||||
}
|
||||
return group, nil
|
||||
}
|
||||
|
||||
// Invalidate triggers a cache reload across all instances.
|
||||
func (gm *GroupManager) Invalidate() error {
|
||||
if gm.syncer == nil {
|
||||
return fmt.Errorf("GroupManager is not initialized")
|
||||
}
|
||||
return gm.syncer.Invalidate()
|
||||
}
|
||||
|
||||
// Stop gracefully stops the GroupManager's background syncer.
|
||||
func (gm *GroupManager) Stop() {
|
||||
if gm.syncer != nil {
|
||||
gm.syncer.Stop()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user