优化leader抢锁的情况
This commit is contained in:
+17
-5
@@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user