Golang怎么实现分布式定时任务_Golang如何保证集群中定时任务不重复执行【进阶】

用 Redis 分布式锁可解决多 Go 进程定时任务重复执行问题,核心是通过 SET key value EX seconds NX 原子命令实现唯一执行权控制,value 必须为唯一标识,过期时间设为任务最长执行时间的 2--3 倍,并用 Lua 脚本安全删锁。用 Redis 分布式锁控制任务唯一执行多个 Go 进程同时拉起定时任务时,cron 本身不带集群协调能力,直接跑就会重复触发。核心解法不是改调度逻辑,而是加一层"谁有资格执行"的判断------用 Redis 实现轻量级分布式锁最常用也最可控。常见错误现象:redis: nil(连接未初始化)、ERR value is not an integer or out of range(SET 命令参数错位)、锁没设过期时间导致死锁。用 SET key value EX seconds NX 原子写入,value 必须是唯一标识(比如主机名+pid),方便后续校验和清理过期时间(EX)建议设为任务最长执行时间的 2--3 倍,太短可能任务还没完锁就丢了,太长会拖慢故障恢复不要用 DEL key 直接删锁------得先 EVAL 脚本比对 value 再删,否则可能误删别人持有的锁Go 里推荐用 github.com/go-redis/redis/v9,它的 SetNX + SetEX 组合不如原生命令原子,老老实实用 Do 调 SET// 示例:获取锁ok, err := rdb.Do(ctx, "SET", "task:send_report", os.Getenv("HOSTNAME")+"-"+strconv.Itoa(os.Getpid()), "EX", "300", "NX").Bool()if err != nil || !ok { return // 没抢到锁,跳过本次执行}选对触发时机:避免 cron + 锁双重延迟很多人把 cron 和分布式锁叠在一起,结果发现任务总在预期时间之后几秒甚至几十秒才执行------问题出在"每个节点都按 cron 触发,再争锁",争锁失败的节点白白空转,还占资源。更稳的做法是只让一个节点负责"触发调度",其他节点只负责"执行"或"跳过"。典型结构:一个中心调度器(哪怕只是个固定 IP 的 Go 进程)按 cron 推送任务 ID 到 Redis List 或 Pub/Sub,所有工作节点监听并竞争执行权。立即学习"go语言免费学习笔记(深入)";如果用 redis.PubSub,注意 Go 客户端默认不重连,断连后收不到新消息,得手动监听 Subscribe 返回的 ErrClosed 并重建连接用 List(LPUSH + BRPOP)更可靠,但要注意 BRPOP 超时设置,别卡太久;任务体建议用 JSON 字符串,字段至少含 id、timeout、retry_count别在 cron 表达式里写 * * * * * 让所有节点每秒都去抢锁------这是典型的"高频率低收益"设计,压 Redis 还容易触发限流任务幂等性不能全靠锁兜底锁只能保证"同一时刻最多一个实例执行",但挡不住网络分区、进程崩溃、Redis 故障这些导致的"锁丢失+任务重试"。所以真正关键的是任务自身必须可重入。 Fotor AI Image Generator Fotor 平台的 AI 图片生成器

相关推荐
Omics Pro2 分钟前
「自兹以往」动物肠道微生物组
数据库·人工智能·机器学习·语言模型·自然语言处理
zzz_236810 分钟前
【Redis】分布式锁完整演进
数据库·redis·分布式
Cloud_Shy61813 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第三章 Item 21 - 24)
开发语言·人工智能·笔记·python·迭代器模式
mN9B2uk1731 分钟前
数据库的约束简介
java·数据库·sql
计算机安禾32 分钟前
【数据库系统原理】第4篇:关系数据结构的形式化定义:域、笛卡尔积与关系模式
数据结构·数据库·算法
Henry-SAP33 分钟前
SAP(ERP) BOM变更实时同步MRP方案
数据库·云原生
AI人工智能+电脑小能手35 分钟前
【大白话说Java面试题 第99题】【Mysql篇】第29题:如何选择合适的分布式主键方案?
java·数据库·分布式·mysql·面试
倔强的石头_2 小时前
kingbase备份与恢复实战(七)—— 恢复演练与验收:从“能恢复”到“可交付预案”
数据库
满昕欢喜2 小时前
第2章 SQL Server 2019服务器管理
数据库·sqlserver
张高兴2 小时前
张高兴的 Hailo-10 开发指南:(二)使用 LangChain 搭建本地大模型 RAG 问答应用
python·边缘计算·hailo