feat: GetTrends 趋势查询并行化 (errgroup)

- 使用 golang.org/x/sync/errgroup 将 4 个独立 DB 查询并行执行
- Energy/Comments/Likes/Favorites 趋势查询不再串行阻塞
- golang.org/x/sync 由 indirect 改为 direct 依赖
This commit is contained in:
2026-06-02 19:37:43 +08:00
parent ab26704049
commit 95e1728c6e
2 changed files with 53 additions and 31 deletions

View File

@ -1,6 +1,10 @@
package service
import "fmt"
import (
"fmt"
"golang.org/x/sync/errgroup"
)
// TrendResult 趋势返回结构
type TrendResult struct {
@ -12,10 +16,10 @@ type TrendResult struct {
// TrendsService Studio 趋势分析服务
type TrendsService struct {
energyRepo EnergyTrendStore
commentRepo CommentTrendStore
likeRepo LikeTrendStore
favoriteRepo FavoriteTrendStore
energyRepo EnergyTrendStore
commentRepo CommentTrendStore
likeRepo LikeTrendStore
favoriteRepo FavoriteTrendStore
}
// NewTrendsService 构造函数
@ -28,32 +32,50 @@ func NewTrendsService(energyRepo EnergyTrendStore, commentRepo CommentTrendStore
}
}
// GetTrends 获取指定时间范围的趋势数据
// GetTrends 获取指定时间范围的趋势数据(并行查询四项趋势)
func (s *TrendsService) GetTrends(userID uint, since string) (*TrendResult, error) {
energy, err := s.energyRepo.AggregateEnergyByAuthor(userID, since)
if err != nil {
return nil, fmt.Errorf("查询赋能趋势: %w", err)
result := &TrendResult{}
g := new(errgroup.Group)
g.Go(func() error {
var err error
result.Energy, err = s.energyRepo.AggregateEnergyByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询赋能趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Comments, err = s.commentRepo.AggregateCommentsByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询评论趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Likes, err = s.likeRepo.AggregateLikesByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询点赞趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Favorites, err = s.favoriteRepo.AggregateFavoritesByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询收藏趋势: %w", err)
}
return nil
})
if err := g.Wait(); err != nil {
return nil, err
}
comments, err := s.commentRepo.AggregateCommentsByAuthor(userID, since)
if err != nil {
return nil, fmt.Errorf("查询评论趋势: %w", err)
}
likes, err := s.likeRepo.AggregateLikesByAuthor(userID, since)
if err != nil {
return nil, fmt.Errorf("查询点赞趋势: %w", err)
}
favorites, err := s.favoriteRepo.AggregateFavoritesByAuthor(userID, since)
if err != nil {
return nil, fmt.Errorf("查询收藏趋势: %w", err)
}
return &TrendResult{
Energy: energy,
Comments: comments,
Likes: likes,
Favorites: favorites,
}, nil
return result, nil
}