优化leader抢锁的情况

This commit is contained in:
Yun
2026-05-27 14:54:23 +08:00
parent ee90cf2e36
commit e964f5e106
+17 -5
View File
@@ -23,10 +23,11 @@ type Leader struct {
ctx context.Context ctx context.Context
cancel context.CancelFunc cancel context.CancelFunc
isLeader bool // 是否是领导 isLeader bool // 是否是领导
leaderLock sync.RWMutex // 领导锁 leaderLock sync.RWMutex // 领导锁
leaderUniLockKey string // 领导唯一锁 leaderUniLockKey string // 领导唯一锁
leaderKey string // 上报当前的Leader leaderKey string // 上报当前的Leader
leaderResetChan chan (struct{}) // 快速抢占Leader位置
redis redis.UniversalClient // redis redis redis.UniversalClient // redis
logger logger.Logger logger logger.Logger
@@ -58,6 +59,7 @@ func InitLeader(ctx context.Context, ref redis.UniversalClient, keyPrefix string
priority: op.priority, priority: op.priority,
instanceId: op.instanceId, instanceId: op.instanceId,
logger: op.logger, logger: op.logger,
leaderResetChan: make(chan struct{}, 1), // 非阻塞
} }
l.wg.Add(1) l.wg.Add(1)
@@ -88,6 +90,8 @@ func (l *Leader) leaderElection() {
select { select {
case <-ticker.C: case <-ticker.C:
l.getLeaderLock() l.getLeaderLock()
case <-l.leaderResetChan:
l.getLeaderLock()
case <-l.ctx.Done(): case <-l.ctx.Done():
return return
} }
@@ -137,7 +141,7 @@ func (l *Leader) getLeaderLock() error {
if l.priority == nil { if l.priority == nil {
return return
} }
// 感知我不是Leader的情况
for { for {
select { select {
case <-ctx.Done(): case <-ctx.Done():
@@ -160,6 +164,14 @@ func (l *Leader) getLeaderLock() error {
l.isLeader = false l.isLeader = false
l.leaderLock.Unlock() l.leaderLock.Unlock()
// 立刻尝试抢锁
go func() {
select {
case l.leaderResetChan <- struct{}{}:
default:
}
}()
return nil return nil
} }