在Austin消息推送平台中,需要完成一个向指定人群定时推送消息的动作,这就要求我去创建一个定时任务,这里我选用的是通过接入xxl-job来启动一个定时任务,而指定人群的输入是通过导入一个.csv文件,读取这个文件里面的信息去支持批量导入信息的。当这个定时任务被调度的时候,需要读取这个文件,解析出来向哪些人群去做推送消息的这个动作。
一开始我认为「读取文件以及业务端远程调用xxl-job接口」是一件比较耗时的工作,所以我这里直接就用线程池做了层异步,避免定时任务超时。
而在读取.csv文件的时候,我最初是设计的一次性读取,然后返回一个list列表List<CrowInfoVo>
,但是后边出现了内存不足的问题。我通过排查分析,判断应该是.csv文件数据过大的时候,存到内存里面的数据体量太大了。
所以,我修改成每当从文件读取一行,我就处理一行。我在拿到每一行数据的时候,封装了一个VO,扔给了内存队列LazyPending,内存队列里会起一个线程去消费队列里的数据,只是为了减少接口调用导致网络传输的次数过于频繁,设置了必须等到积压到给定的size或者timeout才给到实际消费者进行处理。
最后通过批量发送能够实现减少每次远程调用接口带来的网络资源消耗。