From b3c9207ec01332536bb1fd53f4ff1929891c07ce Mon Sep 17 00:00:00 2001 From: 王家文 Date: Wed, 24 Apr 2024 16:20:43 +0800 Subject: [PATCH] feat✨:redis分布式锁增加重试次数 --- service/roomrank/consts.go | 4 +++- service/roomrank/handle.go | 9 ++++++--- service/roomrank/room.go | 1 + util/zredislock/external.go | 7 +++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/service/roomrank/consts.go b/service/roomrank/consts.go index 6c13f36..6bd6304 100644 --- a/service/roomrank/consts.go +++ b/service/roomrank/consts.go @@ -9,5 +9,7 @@ const ( RoomCloseSecond = 180 // 房间关闭时间 RoomResetRobotSecond = 300 // 改变机器人分数并重新排序的间隔时间 - RoomLockMillisecond = 3000 * time.Millisecond // 分布式锁时长 3秒 + RoomLockMillisecond = 5000 * time.Millisecond // 分布式锁时长 5秒 + RoomLockLinearBackoff = 100 * time.Millisecond + RoomLockMaxCount = 20 ) diff --git a/service/roomrank/handle.go b/service/roomrank/handle.go index 7e8f7bd..63a1613 100644 --- a/service/roomrank/handle.go +++ b/service/roomrank/handle.go @@ -55,7 +55,8 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan // 采用分布式锁 lockKey := getLockKey(gameId, config.Id) - lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) + opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { code = code_msg.RECODE_CAOZUOPINFAN_ERROR return @@ -116,7 +117,8 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r // 采用分布式锁 lockKey := getLockKey(gameId, config.Id) - lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) + opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { code = code_msg.RECODE_CAOZUOPINFAN_ERROR return @@ -173,7 +175,8 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs // 采用分布式锁 lockKey := getLockKey(gameId, config.Id) - lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) + opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { code = code_msg.RECODE_CAOZUOPINFAN_ERROR return diff --git a/service/roomrank/room.go b/service/roomrank/room.go index 4930f2c..a5c6ebc 100644 --- a/service/roomrank/room.go +++ b/service/roomrank/room.go @@ -235,6 +235,7 @@ func TryResetRobot(room *Room, config *confroomrank.ActivityConfig) { if secNow < room.ResetRobotTime+RoomResetRobotSecond { return } + room.ResetRobotTime = secNow // 机器人即时算分 for i := 0; i < len(room.Details.Players); i++ { roomPlayer := room.Details.Players[i] diff --git a/util/zredislock/external.go b/util/zredislock/external.go index e6812ca..20324ba 100644 --- a/util/zredislock/external.go +++ b/util/zredislock/external.go @@ -54,3 +54,10 @@ func (l *Lock) Release() { fmt.Println(err) } } + +func GetOptionLimitRetry(duration time.Duration, max int) *redislock.Options { + backoff := redislock.LimitRetry(redislock.LinearBackoff(duration), max) + return &redislock.Options{ + RetryStrategy: backoff, + } +} -- libgit2 0.21.0