浏览代码

perf(internal): 优化加锁策略提高并发性能

- 只在修改共享的错误变量时加锁,减少锁的持有时间
- 移除对每个 goroutine独立变量的加锁,提高并发效率
- 保持数据一致性的同时,提升了系统的整体性能
fusu 2 月之前
父节点
当前提交
f59b09ce7a
共有 1 个文件被更改,包括 16 次插入8 次删除
  1. 16 8
      internal/service/globallimit.go

+ 16 - 8
internal/service/globallimit.go

@@ -148,13 +148,15 @@ func (s *globalLimitService) AddGlobalLimit(ctx context.Context, req v1.GlobalLi
 			Uid:    req.Uid,
 		}
 		result, e := s.tcpLimit.AddTcpLimit(ctx, tcpLimitReq)
-		mu.Lock()
 		if e != nil {
+			// 只在修改共享的错误变量时加锁
+			mu.Lock()
 			err = e
+			mu.Unlock()
 		} else {
+			// 不需要加锁,因为tcpLimitRuleId只被这一个goroutine修改
 			tcpLimitRuleId = result
 		}
-		mu.Unlock()
 	})
 
 	// 启动udpLimit调用 - 使用独立的请求参数副本
@@ -167,13 +169,15 @@ func (s *globalLimitService) AddGlobalLimit(ctx context.Context, req v1.GlobalLi
 			Uid:    req.Uid,
 		}
 		result, e := s.udpLimit.AddUdpLimit(ctx, udpLimitReq)
-		mu.Lock()
 		if e != nil {
+			// 只在修改共享的错误变量时加锁
+			mu.Lock()
 			err = e
+			mu.Unlock()
 		} else {
+			// 不需要加锁,因为udpLimitRuleId只被这一个goroutine修改
 			udpLimitRuleId = result
 		}
-		mu.Unlock()
 	})
 
 	// 启动webLimit调用 - 使用独立的请求参数副本
@@ -186,25 +190,29 @@ func (s *globalLimitService) AddGlobalLimit(ctx context.Context, req v1.GlobalLi
 			Uid:    req.Uid,
 		}
 		result, e := s.webLimit.AddWebLimit(ctx, webLimitReq)
-		mu.Lock()
 		if e != nil {
+			// 只在修改共享的错误变量时加锁
+			mu.Lock()
 			err = e
+			mu.Unlock()
 		} else {
+			// 不需要加锁,因为webLimitRuleId只被这一个goroutine修改
 			webLimitRuleId = result
 		}
-		mu.Unlock()
 	})
 
 	// 启动gatewayGroup调用
 	wg.Go(func() {
 		result, e := s.gateWayGroup.AddGatewayGroup(ctx, gateWayReq)
-		mu.Lock()
 		if e != nil {
+			// 只在修改共享的错误变量时加锁
+			mu.Lock()
 			err = e
+			mu.Unlock()
 		} else {
+			// 不需要加锁,因为gateWayGroupId只被这一个goroutine修改
 			gateWayGroupId = result
 		}
-		mu.Unlock()
 	})
 
 	// 等待所有调用完成