定时任务上多实例部署要过三关:分布式锁防同时跑、水位表防漏跑、补跑要幂等。锁写错比不加锁更险,漏跑比慢跑更贵——对账任务漏一晚,差异就永远对不上。
#Spring Boot
共 11 篇文章
超时关单、预约提醒这类「到点才做」的任务,实现不外乎三种:数据库扫表、MQ 延迟消息、Redis ZSet。先分清业务要准时还是要不丢,选型就不会摇摆。
判断标准只有三个问题:这条数据丢不起吗、能晚多久、要通知几方。三个答案都不紧迫,一张数据库任务表就够;私有化客户拒绝装 MQ 的项目,每天三万单照样跑。
对象存储里没有文件夹,「目录」只是 key 的前缀;前缀定了,权限和生命周期才挂得上去。这篇给一套前缀规划、按前缀授权的写法,和一笔生命周期规则的经济账——配错规则的罚金比省下的钱多。
直传、断点续传、秒传听起来是一个功能的三个阶段,其实是三个独立问题的三种解法:带宽绕行、大文件失败重来、重复文件不传。分清楚这三个问题,才知道自己的系统该先做哪个、哪个根本不用做。附各云厂商分片参数硬数字和一张 upload_task 表。
凌晨一点半,客服在群里说“系统很卡”,这句话没法直接动手。要先把它拆成谁慢、哪个接口慢、从几点开始,才谈得上排查。200 QPS 的系统用不上重型 APM,但 traceId、四组指标和每条告警对应的 Runbook 缺一不可;这三样没有,监控大盘只是挂在墙上的屏保。
隔离模型选对了,租户条件仍然会从别的地方漏掉。缓存 key 少一段前缀,线程池里的上下文随着工作线程复用飘走,定时任务不带租户跑全表,搜索索引查询忘了 filter。八处的共同点不是层级深浅,是它们都绕开了你写好的那一层租户拦截器。按爆炸时间从上线第一天排到第一次月结。
订单状态那一列管得住“现在是什么”,管不住“谁把它改成的”“当时能不能改”“同一件事收到两次会怎样”。把 updateStatus(id, 3) 换成事件加守卫,改动量就是那十几处调用各自想清楚自己发的是哪个事件。
需求说“要加门店”,开发在 sys_dept 上加了一列 type,两行代码当天上线。三个月后加代理商,type 多个值;半年后要求门店同时归区域运营、归总部核算,parent_id 只有一个。行政组织、经营单元、外部主体这三层的差别不在层级深浅,在于谁需要历史、谁会算钱、谁是外部人。
一句“销售只能看自己的客户”,里面藏着行、列、入口、失效四个判定,RBAC 一个都答不了。这篇讲数据范围怎么落成一条 SQL、@DataScope 这类拼法会在哪一层漏、成本价为什么会整整齐齐出现在导出的 Excel 里,以及为什么详情接口是行级权限最大的口子。
多租户不是加个 tenant_id 就完了。共享表、独立 schema、独立库,三种模型的成本和失效方式不一样。这篇按 Spring Boot + MySQL 讲我怎么选、怎么落地,以及异步、定时任务、MQ、导出这些地方怎么漏。
其他标签