近期读者问题集锦

作者: 安琪拉的博客  更新时间:2021-05-20 09:46:45  原文链接


收集了一波近期读者的问题。

1.. offer选择

字节 vs 腾讯?

腾讯的岗位找朋友打听了一下,字节这个读者自己详细的问了一下HR,这里不说太具体信息,说说offer选择的原则(涉及读者的隐私)。

  • 业务前景,这个 工作越久 越会觉得重要,好的业务能让你无论是技术积累还是薪酬比别人快好几倍; 同一个公司做不同业务差别也会很大,比如做淘宝交易系统和做公司内部流程系统,同样一行代码,前者可能服务上亿人,后者公司内部员工几百人,前者高频,后者低频。没有看不起内部流程系统的意思,但是你要知道你的代码服务的人越多,越有价值,重要程度越高,想清楚了这点也就知道应该选什么业务做。

  • 直系Leader,有时候甚至比第一点还重 要,在职业初期很重要,如果你的Leader牛逼而且愿意培养新人,对于刚进入职场的小白来说真的是最大的幸运,你要是聪明好学还勤快,Leader升到类似P10、P9的岗位,带着你也能跟着升到P7、P8,进步最快的方式就是向优秀的人的学习。

  • 前面二点总结起来就是:跟对人,做对事。

  • 技术栈  这位读者刚开始纠结选Java还是Go,语言其实没那么重要,更重要的是技术素养,比如我做业务用Java,JavaScript 和 Python 某些场景也会用。越到后面,语言或者技术栈只是实现想法的工具,工具无所谓好坏,哪个好用用哪个。

  • 钱  这个非常重要,读者可能会决定这还用你说嘛,谁都知道要搞钱。那为什么把这个放在最后,因为在 职业前期 ,相比前面几点,这个相对而已没那么重要。除了SP、SSP,大部分应届进大厂薪资差距不会特别大。如果能做个好项目,跟对好老板,起飞只是早晚问题,我身边的认识的一个朋友,因为毕业就进了核心团队,就跟了个好老板(当时也是很多选择),毕业2年升P7,毕业5年提名P8,今年8基本是稳了。

  • 上面总结就是,路要选择对,路走对了,就不怕远,这句话很多人熟

2. 关于架构方面的问题?对于当前项目架构升级

先说一个前提:对业务开发而言,技术是了为业务目标服务的。

项目不是架构越复杂,技术栈越高大上越好,合适就好。

比如业务就几十的QPS,搞个弹性扩缩容、自适应分布式限流意义不大。

有些读者跟我说,自己的项目没有高并发场景,说实话,真正高并发的系统能有几个,也就头部互联网公司的一些对C的系统,但是可以从别的方面看系统的难点和亮点。

- 有的业务QPS虽然不高,但是业务流程复杂,如果系统设计能把流程清晰且结构化的表达,模块之前划分清楚、模块内部封装的干净也是很值得说的。

- 有的业务对稳定性要求高,停机损失严重,所以如果能把稳定性做好,保障系统稳定运行也是值得说的。

如果系统有高并发的需求或者需要做高并发的技术规划,可以看一些高并发系统设计方面的资料,但是这块实践很重要,因为真实环境会有各种各样的问题,远比书上的复杂。

关于稳定性打算单独写一篇文章介绍一下,主要是讲讲蚂蚁这边是怎么为双11、双12、五福等大促做准备的。

主要涉及到蚂蚁的LDC架构、如何做容量评估?如何做业务域压测和全联路压测、弹性扩缩容、请求蓄洪、合并、缓存防击穿、缓存预热、限流等等。

  1. 要不要报培训班?

这个我觉得要看个人情况,之前写过一篇专科如何逆袭进大厂,里面介绍了我们组的秀哥,双非大学,大学专业学的是制药,通过自学进阿里。

秀哥属于自制力非常强的,我们老板说他 每天 下班回家就是学习,一直持续了大 半年。

如果觉得自己没那个自制力,或者完全没有项目经验,或者正好学的是自己项目中需要(有应用场景可供实践),可以补齐自己短板的,是可以报一个。【补习班的老师看到请后台联系我,自觉把广告费打给我】

但是本身就是从事开发,做的项目也还不错,其实深入研究自己项目,把项目技术栈研究透传,性能优化好可能更合适,当然适当选择一些体系化的课程也是可以的,但是但是但是( 说三遍 )一定要实践(不然你学完很快就忘了)。

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 缓存的是线程;

- Redis 数据有超时时间, cached Pool 的线程也有超时时间,60秒。

Redis 能缓存多少数据是由内存决定, cachedPool可创建线程数也是由内存决定

我们可以测试一下,执行下面这段代码,会有什么 结果?

有JVM经验的都知道线程数到不了1万就会出现内存溢出,如下图

OutOfMemoryError:unable to create new native thread。之前我有文章介绍过Java线程和操作系统线程的关系是一对一的,这里说的native thread 也指的是Java线程。

如果 -Xss 设置的是 1024k,也就是 1M,4G内存也就能创建 1024 * 4 = 4096个线程,这还不包括操作系统本身内存占用, 所以最大线程数设置   Intege r  最大值 基本就是摆设

cachedPool 比较适合处理 任务数量非常多 ,但 执行时间比较小的 任务;但即便如此,生产环境也禁止用newCachedThreadPool的,都是明确调用ThreadPoolExecutor 创建线程池。

篇幅有限,等攒够有代表性的问题再发出来!

如果你看完决定有点收获,欢迎转发分享,您的分享也是我码字的动力。