近期的收到读者的一些问题,懂的我都尽量回答了,有些问题没回答可能是真的不知道,当然不知道我也尽量找认识的大佬请教,
或者当时在
忙,
忘
了
。列了几个比较有代表性的问题。
-
关于架构方面的问题?对于当前项目架构升级
先说一个前提:对业务开发而言,技术是了为业务目标服务的。
项目不是架构越复杂,技术栈越高大上越好,合适就好。
比如业务就几十的QPS,搞个弹性扩缩容、自适应分布式限流意义不大。
有些读者跟我说,自己的项目没有高并发场景,说实话,真正高并发的系统能有几个,也就头部互联网公司的一些对C的系统,但是可以从别的方面看系统的难点和亮点。
- 有的业务QPS
虽然
不高,但是业务流程复杂,如果系统设计能把流程清晰且结构化的表达,模块之前划分清楚、模块内部封装的干净也是很值得说的。
- 有的业务对稳定性要求高,停机损失严重,所以如果能把稳定性做好,保障系统稳定运行也是值得说的。
如果系统有高并发的需求或者需要做高并发的技术规划,可以看一些高并发系统设计方面的资料,但是这块实践很重要,因为真实环境会有各种各样的问题,远比书上的复杂。
关于稳定性打算单独写一篇文章介绍一下,主要是讲讲蚂蚁这边是怎么为双11、双12、五福等大促做准备的。
主要涉及到蚂蚁的LDC架构、如何做容量评估?如何做业务域压测和全联路压测、弹性扩缩容、请求
蓄
洪、
合并、缓存防击穿、缓存预热、限流等等。
-
字节 vs 腾讯?
腾讯的岗位找朋友打听了一下,字节这个读者自己详细的问了一下HR,这里不说太具体信息,说说offer选择的原则(
涉及读者的
隐私
)。
-
业务前景,这个
工作越久
越会觉得重要,好的
业务
能让你无论
是技术积累还是薪酬
比别人快好几倍;
同一个公司做不同业务差别也会很大,比如做淘宝交易系统和做公司内部流程系统,同样一行代码,前者可能服务上亿人,后者公司内部员工几百人,前者高频,后者低频。没有看不起内部流程系统的意思,但是你要知道你的代码服务的人越多,越有价值,重要程度越高,想清楚了这点也就知道应该选什么业务做。
-
直系Leader,有时候甚至比第一点还重
要,在职业初期很重要,如果你的Leader牛逼而且愿意培养新人,对于刚进入职场的小白来说真的是最大的幸运,你要是聪明好学还勤快,Leader升到类似P10、P9的岗位,带着你也能跟着升到P7、P8,进步最快的方式就是向优秀的人的学习。
-
-
技术栈 这位读者刚开始纠结选Java还是Go,语言
其实
没那么重要,更重要的是技术素养,比如我做业务用Java,JavaScript 和 Python 某些场景也会用。越到后面,
语言或者技术栈只是实现
想法
的工具,工具无所谓好坏,哪个好用用哪个。
-
钱 这个非常重要,读者可能会决定这还用你说嘛,谁都知道要搞钱。那
为什么把这个放在最后,因为在
职业前期
,相比前面几点,这个相对而已没那么重要。
除了SP、SSP,大部分应届进大厂薪资差距不会特别大。如果能做个好项目,跟对好老板,起飞只是早晚问题,我身边的认识的一个朋友,因为毕业就进了核心团队,就跟了个好老板(当时也是很多选择),毕业2年升P7,毕业5年提名P8,今年8基本是稳了。
-
上面总结就是,路要选择对,路走对了,就不怕远,这句话很多人熟
-
要不要报培训班?
这个我觉得要看个人情况,之前写过一篇专科如何逆袭进大厂,里面介绍了我们组的秀哥,双非大学,大学专业学的是制药,通过自学进阿里。
秀哥属于自制力非常强的,我们老板说他
每天
下班回家就是学习,一直持续了大
半年。
如果觉得自己没那个自制力,或者完全没有项目经验,或者正好学的是自己项目中需要(有应用场景可供实践),可以补齐自己短板的,是可以报一个。【补习班的老师看到请后台联系我,自觉把广告费打给我】
但是本身就是从事开发,做的项目也还不错,其实深入研究自己项目,把项目技术栈研究透传,性能优化好可能更合适,当然适当选择一些体系化的课程也是可以的,但是但是但是(
说三遍
)一定要实践(不然你学完很快就忘了)。
4
.
面试题,500w数据存Redis?
遇到这种问题,一定不要急着回答。
多问一句,这个实际应用场景是什么?(除非只是单纯为了考你)
首先要搞清楚面试官想考你的是什么?Redis数据结构还是程序设计?
回到这题,从二个方面考虑
- 如果是程序设计,可以把500W数据Reduce拆分成n个分组,多线程并发写;
- 如果是考Redis相关技术,可以用Redis 的
管道技术(
pipeline
)
,通常Redis命令是客户端发送一条指令需要阻塞等待Redis服务端的响应,但是
管道技术可以
在服务端未响应时,客户端继续向服务端发送请求,最终一次性读取所有服务端的响应。提高了redis服务的性能,如果存500W数据有时间要求很适合。
当然上面二个可以结合起来一起用。
5.
线程池CachedThreadlocalPool 为什么叫Cached?
这个问题我之前也没仔细研究过,后来看了源码注释大概清楚了。
上面是 newCachedThreadPool 的定义,简单说一下:
- 核心线程数为0,最大线程数为 Integer最大值;
- 空闲
线程的
超时时间是60秒(60秒不执行任务
线程
销毁)
- 任务队列为SynchronousQueue
,
这个阻塞队列没有存储空间,这意味着只要有请求到来,就必须要找到一条工作线程处理它,如果当前没有空闲的线程,那么就会再创建一条新的线程。
new
Cached
Thread
Pool叫 cached的原因是他缓存了线程(复用线程),其他线程池也会缓存线程,但是区别在于cachedPool没有让任务排队,来一个任务,要么复用已有线程处理,要么新建一个线程处理。
可以类比Redis,后面我都把
new
Cached
Thread
Pool
简称为cachedPool
- Redis 缓存的是数据,
cached
Pool