Commit b3c9207ec01332536bb1fd53f4ff1929891c07ce
1 parent
e9b50cae
Exists in
master
and in
1 other branch
feat✨:redis分布式锁增加重试次数
Showing
4 changed files
with
17 additions
and
4 deletions
Show diff stats
service/roomrank/consts.go
| @@ -9,5 +9,7 @@ const ( | @@ -9,5 +9,7 @@ const ( | ||
| 9 | RoomCloseSecond = 180 // 房间关闭时间 | 9 | RoomCloseSecond = 180 // 房间关闭时间 |
| 10 | RoomResetRobotSecond = 300 // 改变机器人分数并重新排序的间隔时间 | 10 | RoomResetRobotSecond = 300 // 改变机器人分数并重新排序的间隔时间 |
| 11 | 11 | ||
| 12 | - RoomLockMillisecond = 3000 * time.Millisecond // 分布式锁时长 3秒 | 12 | + RoomLockMillisecond = 5000 * time.Millisecond // 分布式锁时长 5秒 |
| 13 | + RoomLockLinearBackoff = 100 * time.Millisecond | ||
| 14 | + RoomLockMaxCount = 20 | ||
| 13 | ) | 15 | ) |
service/roomrank/handle.go
| @@ -55,7 +55,8 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan | @@ -55,7 +55,8 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan | ||
| 55 | 55 | ||
| 56 | // 采用分布式锁 | 56 | // 采用分布式锁 |
| 57 | lockKey := getLockKey(gameId, config.Id) | 57 | lockKey := getLockKey(gameId, config.Id) |
| 58 | - lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) | 58 | + opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) |
| 59 | + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) | ||
| 59 | if lock.Err != nil { | 60 | if lock.Err != nil { |
| 60 | code = code_msg.RECODE_CAOZUOPINFAN_ERROR | 61 | code = code_msg.RECODE_CAOZUOPINFAN_ERROR |
| 61 | return | 62 | return |
| @@ -116,7 +117,8 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r | @@ -116,7 +117,8 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r | ||
| 116 | 117 | ||
| 117 | // 采用分布式锁 | 118 | // 采用分布式锁 |
| 118 | lockKey := getLockKey(gameId, config.Id) | 119 | lockKey := getLockKey(gameId, config.Id) |
| 119 | - lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) | 120 | + opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) |
| 121 | + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) | ||
| 120 | if lock.Err != nil { | 122 | if lock.Err != nil { |
| 121 | code = code_msg.RECODE_CAOZUOPINFAN_ERROR | 123 | code = code_msg.RECODE_CAOZUOPINFAN_ERROR |
| 122 | return | 124 | return |
| @@ -173,7 +175,8 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs | @@ -173,7 +175,8 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs | ||
| 173 | 175 | ||
| 174 | // 采用分布式锁 | 176 | // 采用分布式锁 |
| 175 | lockKey := getLockKey(gameId, config.Id) | 177 | lockKey := getLockKey(gameId, config.Id) |
| 176 | - lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) | 178 | + opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) |
| 179 | + lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) | ||
| 177 | if lock.Err != nil { | 180 | if lock.Err != nil { |
| 178 | code = code_msg.RECODE_CAOZUOPINFAN_ERROR | 181 | code = code_msg.RECODE_CAOZUOPINFAN_ERROR |
| 179 | return | 182 | return |
service/roomrank/room.go
| @@ -235,6 +235,7 @@ func TryResetRobot(room *Room, config *confroomrank.ActivityConfig) { | @@ -235,6 +235,7 @@ func TryResetRobot(room *Room, config *confroomrank.ActivityConfig) { | ||
| 235 | if secNow < room.ResetRobotTime+RoomResetRobotSecond { | 235 | if secNow < room.ResetRobotTime+RoomResetRobotSecond { |
| 236 | return | 236 | return |
| 237 | } | 237 | } |
| 238 | + room.ResetRobotTime = secNow | ||
| 238 | // 机器人即时算分 | 239 | // 机器人即时算分 |
| 239 | for i := 0; i < len(room.Details.Players); i++ { | 240 | for i := 0; i < len(room.Details.Players); i++ { |
| 240 | roomPlayer := room.Details.Players[i] | 241 | roomPlayer := room.Details.Players[i] |
util/zredislock/external.go
| @@ -54,3 +54,10 @@ func (l *Lock) Release() { | @@ -54,3 +54,10 @@ func (l *Lock) Release() { | ||
| 54 | fmt.Println(err) | 54 | fmt.Println(err) |
| 55 | } | 55 | } |
| 56 | } | 56 | } |
| 57 | + | ||
| 58 | +func GetOptionLimitRetry(duration time.Duration, max int) *redislock.Options { | ||
| 59 | + backoff := redislock.LimitRetry(redislock.LinearBackoff(duration), max) | ||
| 60 | + return &redislock.Options{ | ||
| 61 | + RetryStrategy: backoff, | ||
| 62 | + } | ||
| 63 | +} |