优化部分并发问题
This commit is contained in:
+11
-6
@@ -70,6 +70,9 @@ func InitCluster(ctx context.Context, red redis.UniversalClient, keyPrefix strin
|
|||||||
|
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
ctx, cancel := context.WithCancel(ctx)
|
||||||
|
|
||||||
|
// 清理 keyPrefix 中的 {} 字符,避免破坏 Redis Cluster hash tag
|
||||||
|
keyPrefix = sanitizeKeyPrefix(keyPrefix)
|
||||||
|
|
||||||
U, err := uuid.NewV7()
|
U, err := uuid.NewV7()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
op.logger.Errorf(ctx, "InitCluster uuid.NewV7 err:%v, using fallback", err)
|
op.logger.Errorf(ctx, "InitCluster uuid.NewV7 err:%v, using fallback", err)
|
||||||
@@ -548,10 +551,7 @@ func (c *Cluster) executeTasks() {
|
|||||||
case <-c.ctx.Done():
|
case <-c.ctx.Done():
|
||||||
return
|
return
|
||||||
case c.workerChan <- struct{}{}:
|
case c.workerChan <- struct{}{}:
|
||||||
go func() {
|
func() {
|
||||||
defer func() {
|
|
||||||
<-c.workerChan
|
|
||||||
}()
|
|
||||||
|
|
||||||
if c.usePriority && !c.priority.IsLatest(c.ctx) {
|
if c.usePriority && !c.priority.IsLatest(c.ctx) {
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
@@ -572,7 +572,7 @@ func (c *Cluster) executeTasks() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.processTask(taskID[1])
|
go c.processTask(taskID[1])
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -582,6 +582,10 @@ func (c *Cluster) executeTasks() {
|
|||||||
// 执行任务
|
// 执行任务
|
||||||
func (l *Cluster) processTask(taskId string) {
|
func (l *Cluster) processTask(taskId string) {
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
<-l.workerChan
|
||||||
|
}()
|
||||||
|
|
||||||
begin := time.Now()
|
begin := time.Now()
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
||||||
@@ -618,7 +622,8 @@ func (l *Cluster) processTask(taskId string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 这里加一个全局锁
|
// 这里加一个全局锁
|
||||||
lock, err := lockx.NewGlobalLock(ctx, l.redis, taskId)
|
lockKey := l.lockKey + "_task_" + taskId
|
||||||
|
lock, err := lockx.NewGlobalLock(ctx, l.redis, lockKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.logger.Errorf(ctx, "doTask timer:获取锁失败:%s", taskId)
|
l.logger.Errorf(ctx, "doTask timer:获取锁失败:%s", taskId)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package timerx
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
// sanitizeKeyPrefix 移除 keyPrefix 中的 {} 字符,避免破坏 Redis Cluster hash tag
|
||||||
|
// Redis Cluster 使用 first {..} 配对作为 hash tag,keyPrefix 中包含的 {} 会干扰此机制
|
||||||
|
func sanitizeKeyPrefix(keyPrefix string) string {
|
||||||
|
keyPrefix = strings.ReplaceAll(keyPrefix, "{", "_")
|
||||||
|
keyPrefix = strings.ReplaceAll(keyPrefix, "}", "_")
|
||||||
|
return keyPrefix
|
||||||
|
}
|
||||||
@@ -106,6 +106,9 @@ func InitOnce(ctx context.Context, re redis.UniversalClient, keyPrefix string, c
|
|||||||
return nil, errors.New("redis client is nil")
|
return nil, errors.New("redis client is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清理 keyPrefix 中的 {} 字符,避免破坏 Redis Cluster hash tag
|
||||||
|
keyPrefix = sanitizeKeyPrefix(keyPrefix)
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
ctx, cancel := context.WithCancel(ctx)
|
||||||
|
|
||||||
u, err := uuid.NewV7()
|
u, err := uuid.NewV7()
|
||||||
@@ -307,10 +310,7 @@ func (l *Once) executeTasks() {
|
|||||||
case <-l.ctx.Done():
|
case <-l.ctx.Done():
|
||||||
return
|
return
|
||||||
case l.workerChan <- struct{}{}:
|
case l.workerChan <- struct{}{}:
|
||||||
go func() {
|
func() {
|
||||||
defer func() {
|
|
||||||
<-l.workerChan
|
|
||||||
}()
|
|
||||||
|
|
||||||
if l.usePriority && !l.priority.IsLatest(l.ctx) {
|
if l.usePriority && !l.priority.IsLatest(l.ctx) {
|
||||||
time.Sleep(time.Second * 5)
|
time.Sleep(time.Second * 5)
|
||||||
@@ -331,7 +331,7 @@ func (l *Once) executeTasks() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 处理任务
|
// 处理任务
|
||||||
l.processTask(keys[1])
|
go l.processTask(keys[1])
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -566,6 +566,10 @@ func (l *Once) batchGetTasks() {
|
|||||||
// 执行任务
|
// 执行任务
|
||||||
func (l *Once) processTask(key string) {
|
func (l *Once) processTask(key string) {
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
<-l.workerChan
|
||||||
|
}()
|
||||||
|
|
||||||
begin := time.Now()
|
begin := time.Now()
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
ctx, cancel := context.WithTimeout(l.ctx, l.timeout)
|
||||||
|
|||||||
Reference in New Issue
Block a user