mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-10 15:26:38 +08:00
6
This commit is contained in:
@@ -26,10 +26,13 @@ var (
|
|||||||
executorOnce sync.Once
|
executorOnce sync.Once
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetGlobalExecutor 获取全局队列执行器单例(默认 QPS=2, QPM=120, QPH=6000,保障 115 API 调用安全不超频)。
|
// GetGlobalExecutor 获取全局队列执行器单例(默认 QPS=8, QPM=480, QPH=20000,保障 115 API 调用安全不超频)。
|
||||||
|
// QPS 从 2 提到 8:下载/列表等场景下过去 QPS=2 将所有直链换取串行为每秒 2 个,是下载吞吐的最大瓶颈。
|
||||||
|
// 8 是经过折中的安全值——远低于 115 WAF 风控触发阈值(QPS≈20 起才有明显风险),
|
||||||
|
// 又能让多 worker 并发换取直链,显著提升元数据下载速度。
|
||||||
func GetGlobalExecutor() *QueueExecutor {
|
func GetGlobalExecutor() *QueueExecutor {
|
||||||
executorOnce.Do(func() {
|
executorOnce.Do(func() {
|
||||||
globalExecutor = NewQueueExecutor(2, 120, 6000)
|
globalExecutor = NewQueueExecutor(8, 480, 20000)
|
||||||
})
|
})
|
||||||
return globalExecutor
|
return globalExecutor
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
@@ -27,7 +28,10 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// downloadWorker 下载队列 worker:认领 → 解析直链 → 下载 → 落盘。
|
// downloadWorker 下载队列 worker:认领 → 解析直链 → 下载 → 落盘。
|
||||||
|
// 每次批量认领数个任务,并对这批任务并发下载,让「换直链」和「实际下载」
|
||||||
|
// 在不同任务间重叠,从而充分利用多线程与 115 换链 QPS。
|
||||||
func (s *StrmService) downloadWorker(ctx context.Context) {
|
func (s *StrmService) downloadWorker(ctx context.Context) {
|
||||||
|
const claimBatch = 12 // 每次批量认领的任务数
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
@@ -42,7 +46,7 @@ func (s *StrmService) downloadWorker(ctx context.Context) {
|
|||||||
sleepContext(ctx, left)
|
sleepContext(ctx, left)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
tasks, err := s.repo.StrmDownload.ClaimPendingDownload(ctx, 1)
|
tasks, err := s.repo.StrmDownload.ClaimPendingDownload(ctx, claimBatch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.log.Warn("claim strm download task failed", zap.Error(err))
|
s.log.Warn("claim strm download task failed", zap.Error(err))
|
||||||
sleepContext(ctx, 3*time.Second)
|
sleepContext(ctx, 3*time.Second)
|
||||||
@@ -52,9 +56,16 @@ func (s *StrmService) downloadWorker(ctx context.Context) {
|
|||||||
sleepContext(ctx, 2*time.Second)
|
sleepContext(ctx, 2*time.Second)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// 并发处理本批认领到的任务,充分利用多线程下载 & 直链换取并发
|
||||||
|
var wg sync.WaitGroup
|
||||||
for i := range tasks {
|
for i := range tasks {
|
||||||
s.processDownloadTask(ctx, &tasks[i])
|
wg.Add(1)
|
||||||
|
go func(i int) {
|
||||||
|
defer wg.Done()
|
||||||
|
s.processDownloadTask(ctx, &tasks[i])
|
||||||
|
}(i)
|
||||||
}
|
}
|
||||||
|
wg.Wait()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-25
@@ -1,25 +0,0 @@
|
|||||||
package main
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"github.com/ShukeBta/MMTL/internal/service"
|
|
||||||
"github.com/ShukeBta/MMTL/internal/service/cloud115"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
)
|
|
||||||
func main() {
|
|
||||||
crypto := service.NewCryptoService("test-secret", zap.NewNop())
|
|
||||||
// Let's test with a mock RemoteFileDetail
|
|
||||||
d := &cloud115.RemoteFileDetail{
|
|
||||||
FileId: "3251154147730910635",
|
|
||||||
FileName: "出包王女",
|
|
||||||
Paths: []struct {
|
|
||||||
FileId string
|
|
||||||
Name string
|
|
||||||
}{
|
|
||||||
{FileId: "0", Name: "根目录"},
|
|
||||||
{FileId: "3238787832374488117", Name: "影视库"},
|
|
||||||
{FileId: "3238787913223892116", Name: "动漫"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
fmt.Println("RelativePath when rootCID is 3238787832374488117:", d.RelativePath("3238787832374488117"))
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user