Update Context for store
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
// Filename: internal/service/db_log_writer_service.go
|
||||
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"gemini-balancer/internal/models"
|
||||
"gemini-balancer/internal/settings"
|
||||
@@ -35,35 +35,30 @@ func NewDBLogWriterService(db *gorm.DB, s store.Store, settings *settings.Settin
|
||||
store: s,
|
||||
SettingsManager: settings,
|
||||
logger: logger.WithField("component", "DBLogWriter📝"),
|
||||
// 使用配置值来创建缓冲区
|
||||
logBuffer: make(chan *models.RequestLog, bufferCapacity),
|
||||
stopChan: make(chan struct{}),
|
||||
logBuffer: make(chan *models.RequestLog, bufferCapacity),
|
||||
stopChan: make(chan struct{}),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *DBLogWriterService) Start() {
|
||||
s.wg.Add(2) // 一个用于事件监听,一个用于数据库写入
|
||||
|
||||
// 启动事件监听器
|
||||
s.wg.Add(2)
|
||||
go s.eventListenerLoop()
|
||||
// 启动数据库写入器
|
||||
go s.dbWriterLoop()
|
||||
|
||||
s.logger.Info("DBLogWriterService started.")
|
||||
}
|
||||
|
||||
func (s *DBLogWriterService) Stop() {
|
||||
s.logger.Info("DBLogWriterService stopping...")
|
||||
close(s.stopChan) // 通知所有goroutine停止
|
||||
s.wg.Wait() // 等待所有goroutine完成
|
||||
close(s.stopChan)
|
||||
s.wg.Wait()
|
||||
s.logger.Info("DBLogWriterService stopped.")
|
||||
}
|
||||
|
||||
// eventListenerLoop 负责从store接收事件并放入内存缓冲区
|
||||
func (s *DBLogWriterService) eventListenerLoop() {
|
||||
defer s.wg.Done()
|
||||
|
||||
sub, err := s.store.Subscribe(models.TopicRequestFinished)
|
||||
ctx := context.Background()
|
||||
sub, err := s.store.Subscribe(ctx, models.TopicRequestFinished)
|
||||
if err != nil {
|
||||
s.logger.Fatalf("Failed to subscribe to topic %s: %v", models.TopicRequestFinished, err)
|
||||
return
|
||||
@@ -80,34 +75,27 @@ func (s *DBLogWriterService) eventListenerLoop() {
|
||||
s.logger.Errorf("Failed to unmarshal event for logging: %v", err)
|
||||
continue
|
||||
}
|
||||
|
||||
// 将事件中的日志部分放入缓冲区
|
||||
select {
|
||||
case s.logBuffer <- &event.RequestLog:
|
||||
default:
|
||||
s.logger.Warn("Log buffer is full. A log message might be dropped.")
|
||||
}
|
||||
|
||||
case <-s.stopChan:
|
||||
s.logger.Info("Event listener loop stopping.")
|
||||
// 关闭缓冲区,以通知dbWriterLoop处理完剩余日志后退出
|
||||
close(s.logBuffer)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// dbWriterLoop 负责从内存缓冲区批量读取日志并写入数据库
|
||||
func (s *DBLogWriterService) dbWriterLoop() {
|
||||
defer s.wg.Done()
|
||||
|
||||
// 在启动时获取一次配置
|
||||
cfg := s.SettingsManager.GetSettings()
|
||||
batchSize := cfg.LogFlushBatchSize
|
||||
if batchSize <= 0 {
|
||||
batchSize = 100
|
||||
}
|
||||
|
||||
flushTimeout := time.Duration(cfg.LogFlushIntervalSeconds) * time.Second
|
||||
if flushTimeout <= 0 {
|
||||
flushTimeout = 5 * time.Second
|
||||
@@ -126,7 +114,7 @@ func (s *DBLogWriterService) dbWriterLoop() {
|
||||
return
|
||||
}
|
||||
batch = append(batch, logEntry)
|
||||
if len(batch) >= batchSize { // 使用配置的批次大小
|
||||
if len(batch) >= batchSize {
|
||||
s.flushBatch(batch)
|
||||
batch = make([]*models.RequestLog, 0, batchSize)
|
||||
}
|
||||
@@ -139,7 +127,6 @@ func (s *DBLogWriterService) dbWriterLoop() {
|
||||
}
|
||||
}
|
||||
|
||||
// flushBatch 将一个批次的日志写入数据库
|
||||
func (s *DBLogWriterService) flushBatch(batch []*models.RequestLog) {
|
||||
if err := s.db.CreateInBatches(batch, len(batch)).Error; err != nil {
|
||||
s.logger.WithField("batch_size", len(batch)).WithError(err).Error("Failed to flush log batch to database.")
|
||||
|
||||
Reference in New Issue
Block a user