springboot-动态修改定期任务
架构案例
后台经常有一些定期任务需要运行, 比如检查集群的状态, 统计汇总数据等, 但检查的频率如何确定是个头疼的地方.
比如某个前端的交互操作, 高度依赖后端集群多个服务的稳定. 若是设置每次前端请求都调用检查健康状态, 则会延长前端接口的反应速度. 若是设置了一个定期的集群资源巡检, 则需要考虑巡检周期. 如果把周期设置为很短, 资源消耗很严重, 经常空跑性价比不高. 如果设置较长的时间间隔, 出问题的时候就算手动修复了服务, 也需要等待下一个长周期才能使用, 用户体验难以接受.
一个巧妙的解决方法, 就是动态修改定期任务. 当巡检发现服务正常, 下一次巡检的时间可以较长; 当巡检发现服务故障, 为了快速响应服务的变更状态, 需要降低巡检的周期.
- 要么自己实现定期的巡检线程, 自由控制线程sleep时间.
- 要么设置非常短的scheduler deplay time, 如果上一次状态是健康的, 则执行的时候快速 return 跳过, 减少资源消耗.
- 要么就是改写springboot的动态调度机制, 不过看起来都是绕行的方法:
类似的场景
类似的场景, 还有对queue队列的读取选择.
比如ranger里通过queue读取到审计信息, 然后再写入到es中. 通常都是用queue.poll的方式读取, 来一个元素就处理一个, 但性能太慢了. 为了加快缓存队列的批量处理速度, 当队列没有读取到元素的时候, 线程sleep. 当读到一个元素的时候, 批量快速读取n个, 再进行批量入库处理.
created at Tue Jul 04 2023 08:00:00 GMT+0800 (China Standard Time)