点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
There are plenty of things in life that you don't want to do but you have to,this is responsibility.For the things that you want to do but you can't,this is fate.
生命中有许多你不想做却不能不做的事,这就是责任;生命中有许多你想做却不能做的事,这就是命运。
每日掏心话
有一个夜晚我烧毁了所有的记忆,从此我的梦就透明了;有一个早晨我扔掉了所有的昨天,从此我的脚步就轻盈了。
来自:闪客sun | 责编:乐乐
链接:cnblogs.com/flashsun/p/7744466.html
程序员小乐(ID:study_tech)第 768 次推文 图片来自 Pexels
往日回顾:重大突破!这两种药能抑制冠状病毒,上市公司连拉四个涨停板!疫情攻坚战将迎来曙光?
正文
项目要求为:
特征:面向过程、单一线程、不可拓展、极度耦合、逐条插入、数据不可恢复
最初的一版简直是汇聚了一个项目的所有缺点。整个流程就是从A库读出一条数据,立刻做处理,然后调用接口插入B库,然后在拼一个关联表的sql语句,插入A库。没有计数器,没有错误信息处理。这样下来的代码最终预测2000万条数据要处理2个月。如果中间哪怕一条数据出错,又要重新再来2个月。简直可怕。
这个流程图就等同于废话,是完全基于面向过程的思想,整个代码就是在一个大main方法里写的,实际业务流程完全等同于代码的流程。思考起来简单,但实现和维护起来极为困难,代码结构冗长混乱。而且几乎是不可扩展的。暂且不谈代码的设计美观,它的效率如此低下主要有一下几点:
1、每一条数据的速度受制于整个链条中最慢的一环。试想假如有一条A库插入关联表的数据卡住了,等待将近1分钟(夸张了点),那这一分钟jvm完全就在傻等,它完全可以继续进行之前的两步。正如你等待鸡蛋煮熟的过程中可以同时去做其他的事一样。2、向B库插入用户需要调用sdk(HTTP请求)接口,那每一次调用都需要建立连接,等待响应,再释放链接。正如你要给朋友送一箱苹果,你分成100次每次只送一个,时间全搭载路上了。
特征:面向对象、单一线程、可拓展、略微耦合、批量插入、数据可恢复
3.2、效率问题
可以看出,本次效率提升仅仅是在减少http请求次数,优化sql的插入逻辑方面做出来努力,但依然没有解决第一版的一个致命问题,就是一次循环的速度依然受制于整个链条中最慢的一环,三者没有解耦也可以从这一点看出,在其他两者没有将工作做完时,就只能傻等,这是效率损失最严重的地方了。
特征:面向对象、多线程、可拓展、完全解耦、批量插入、数据可恢复。
有了这样的接口设计,不论实现类具体怎么写,主方法已经可以写出了,变得异常整洁有序。
只提炼主干部分,去掉了一些细枝末节,如日志输出、时间记录等。
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。
欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
一种前端灰度发布方案
高并发下的抽奖优化
Git 如何优雅地回退代码
文章有问题?点此查看未经处理的缓存