You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于企业配置的到期发票提醒发送方案优化咨询

优化到期发票提醒任务的性能方案

一、数据层查询优化

  • 预计算提醒触发日期:别在定时任务里反复计算“到期前N天”,改成在发票创建、企业配置更新时,提前算出所有需要触发提醒的日期,存在单独的invoice_reminder_schedule表(字段:发票ID、企业ID、提醒触发日期、是否已发送)。比如A企业某发票到期日是2024-10-10,配置7天、2天提醒,就生成两条触发记录:2024-10-03和2024-10-08。定时任务只需查trigger_date = CURDATE() AND is_sent = 0的记录,不用遍历20万条未付发票,性能直接拉满。
  • 针对性加索引:如果必须保留原查询逻辑,给发票表的到期日、是否已付、企业ID加联合索引;给企业配置表的企业ID、提醒间隔列表加索引,彻底避免全表扫描。
  • 分库分表/分区:如果发票量还会涨,按企业ID或到期年月给发票表做分区或分库分表,缩小每次查询的数据范围,减少单表数据压力。

二、任务调度优化

  • 拆分任务并行执行:别用单任务扛所有数据,按企业ID范围、到期日期区间拆成多个子任务,同时跑。比如把企业ID分成10个区间,每个区间单独跑一个任务,榨干多核CPU的性能。
  • 错峰+增量处理:如果不是必须零点触发,把任务拆成每小时跑一次当天待触发的增量记录,避免一次性处理海量数据;同时记录上次任务的执行时间,只处理新增的待提醒条目,不用每次全量扫描。
  • 用事件驱动替代轮询:结合消息队列,当发票创建、到期日修改、企业配置更新时,发消息到MQ,由消费服务计算并生成提醒任务存入调度表。定时任务只需要读调度表的待触发记录,大幅减少轮询的开销。

三、执行逻辑优化

  • 批量处理+批量发邮件:查到待提醒记录后,按企业或邮箱服务商批量处理。比如同一个企业的多个发票提醒合并成一封邮件,或者用邮件服务商的批量API发送,减少单条发送的IO浪费。
  • 缓存企业配置:把企业的提醒配置存在Redis这类内存数据库里,定时任务直接从缓存读,不用每次都查DB,减少数据库访问次数。
  • 幂等性控制:给每个提醒任务生成唯一ID,标记已发送的记录,就算任务重复执行也不会多发邮件,避免重复处理的问题。

四、额外优化点

  • 异步发送邮件:定时任务只负责筛选出需要提醒的发票和收件信息,把这些数据扔到消息队列,由专门的邮件服务异步发送,避免邮件发送阻塞任务执行。
  • 定期清理历史数据:把已发送超过30天的提醒记录删掉,减少调度表的数据量,提升查询速度。

内容的提问来源于stack exchange,提问作者T. Ikbal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:37:12