这是一个去年根据线上问题而改编的项目。
在实际生产中,我们可能会经常遇到需要数据落地到DB或者其他存储介质。但是大量数据在高并发下需要落地,如果不做任何措施,将是高频率地访问DB(或其他存储介质)、占用网络IO。为了解决这个问题,这个项目横空出世了。批量异步数据输出。防止高频率访问DB,网络IO,有节操地使用资源。
项目运行原理:
(SkuTemplate是客户端实现的读取数据模板,自定义的ConcurrentWriter对应项目中的客户端实现的SkuHandler)
项目用法:
整个项目框架通过配置文件配置,客户端需要继承AbstractConcurrentWriter类,实现自己的落地方案。
1.异步输出模板类SkuTemplate继承这个抽象类AbstractConcurrentTemplate,实现其hash分片的算法(getReader(T t)方法,也可以使用其他分片方法,起到负载均衡作用)public IConcurrentReader getReader(Sku t) {
int hashCode = t.getId().hashCode();
IConcurrentReader[] readers = this.getReaders();
IConcurrentReader reader = readers[hashCode%this.getQueueSize()];
if(reader!=null){
return reader;
}
return null;
}
2.客户端实际落地类SkuHandlerextendsAbstractConcurrentWriter,实现具体落地的方法public void write(MemoryPage t) {
List skuList = t.getContent();
if(skuList!=null && skuList.size()>0){
for(Sku sku : skuList){
logger.debug("write sku info|{}", sku);
}
logger.info("write {} skuList", t.size());
}
}
3.main 函数入口public static void main(String[] args) {
logger.info("read start..........");
TestMain main = new TestMain(2);
main.testRead();
}
4.配置文件concurrentWrite.properties中
#初始化线程池线程数
write.thread.size=3
#写入落地的线程数
writer.size=3
#最大内存页数
memory.max.size=100
#单位s
memory.timeout=5
#客户端实现类
concurrent.writer.class=com.cuncurrent.sdk.test.SkuHandler
5.项目运行图