SynchronousQueue+CallerRunsPolicy+ApplicationShutdownHook+记录offset+记录详情到日志表 保证高并发下的高可靠

本文探讨了在高并发环境下,如何通过SynchronousQueue结合CallerRunsPolicy线程池策略避免数据丢失,保证数据可靠性。同时,介绍了利用ApplicationShutdownHook在程序关闭时优雅地处理未完成任务,以及记录offset和日志来防止数据丢失和重复。这些措施在提升系统稳定性的同时,也便于问题排查和对账。
高并发的情况下,最大限度防线程池数据丢失和保证数据可靠性,主要办法SynchronousQueue+CallerRunsPolicy+ApplicationShutdownHook+记录offset+记录详情到日志表
//当核心线程数等于最大线程数keepAliveTime是失效的

//SynchronousQueue零容量队列,即无等待队列

//线程拒绝策略CallerRunsPolicy:核心线程和临时线程都在工作,且达到最大线程数,且队列已满,新加任务会在父线程执行,阻塞父线程。

SynchronousQueue+CallerRunsPolicy可以防止数据丢失,因为任务要么被线程池线程消费。要么线程池达到最大线程数且全部在工作就会被父线程消费阻塞父线程以防止提交新的任务。

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(maxConcurrentThreadNum, maxConcurrentThreadNum * 2, 60L, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());

以上线程池配置配上ApplicationShutdownHook 可最大限度保证数据不丢失,可以在关闭钩子里修改一个全局共享且线程安全的变量的值,用来告诉所有用到线程池的地方停止接受新任务,然后等待30秒(目的是让已经提交的任务执行完,这个时间可以适当调整) ,然后关闭程序

//ApplicationShutdownHook使用示例
Runtime.getRuntime().addShutdownHook(new Thread(()->System.out.println("程序正常关闭")));

记录offset ,可以防止数据丢失和重复

记录详情到日志表, 虽然会因为IO操作导致性能降低,但牺一丢丢性能增加了可靠性,可以防止数据丢失和重复
,且在排查问题和对账时起到关键性作用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值