慢慢学

翻译 2018年04月15日 23:00:39
作者:下一秒升华
链接:https://www.zhihu.com/question/59725713/answer/168294369
来源:知乎

初级—初阶
掌握java基础,熟悉常用类库。理解javaweb中的servlet,jsp,并了解常用的框架对java web的封装原理,能够借助框架完成增删改查功能。理解数据库在web开发中的地位。初级—中阶
理解java中较为高级的特性,如反射,动态代理,JVM,内存模型,多线程等等。熟练使用框架,对框架中遇到的bug,能够借助日志和搜索引擎分析出问题的原因。在团队中,能够独立完成普通后台业务功能的开发。了解数据库的高级特性,如索引,存储引擎等等初级—高阶
理解java分布式架构,微服务架构(如rpc框架dubbo,motan,或springcloud一类)了解其与集中式架构的区别,并能保证分布式代码质量。熟练使用各个中间件如redis,mq,zookeeper等等,并了解其工作原理和使用场景。能够在中级或高级程序员的带领之下,完成非核心功能的研发。能够关注开源,并且具有阅读源码的能力。中级
初级高阶已经很厉害了,但是往往缺乏的是一些项目经验,所以在我这里还是初级。脱离初级程序员不仅仅需要技术方面的支撑,还需要具备一定的项目开发经验(3年之上一线互联网产品研发经验),拥有线上bug的处理能力,JVM调优能力,以及完成核心业务功能的开发。并且带领团队的新人,能够按能力分配任务。(本想把初级高阶分为中级初阶,但我还是觉得中级必备的水平是线上解决bug的能力)高级
团队的核心人物,把控整个项目的质量,包括代码漏洞和规范问题。具有5年以上项目开发经验,2年以上架构搭建的经验,能够根据业务选择不同的架构类型;根据团队组成,分配不同的任务。具有将自己的知识分享出去的能力,带领初级程序员走向中级,中级程序员走向高级的能力。

作者:下一秒升华
链接:https://www.zhihu.com/question/59725713/answer/168294369
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你问: java web中线程不是由tomcat这类web容器负责的吗?为什么还要我去控制多线程?

答:从一个例子开始给你讲起,现在有一个任务,从http接口获取商品信息,完成一些业务逻辑的处理对数据进行修饰,插入到数据库,数据量大概是10w级别。这个需求在你看来很简单吧,开发并不难完成。初级程序员是怎么做的,每次获取一个商品,然后保存到数据库,同步进行。整个编码不超过30分钟即可完成。然后实际操作,发现由于网络io,数据库io大数据量的问题导致了你等待了一天,完成了同步数据的操作。

有经验的程序员如何分析这个需求呢?上述初级程序员最直接的想法导致了数据库io发生了10w次,http请求发生了10w次(因为有10w个商品信息),优化点有三:一,查看是否有批量获取商品信息的接口,一次如果能获得100个商品,那么网络io会减少到1000次;二,存储到数据库可以使用批处理,一次保存500条,这样数据库io减少到200次;三,就是你提到的多线程了,因为每个操作是互相独立的,并且需求中提到了会进行数据的处理,而cpu密集型操作,就能体现多线程的优势,上一个商品的信息不会影响到下一个商品,所以我们可以很简单的使用一个线程池,多线程批量获取数据,批量插入数据库。于是,最终只需要等待不到1个小时,就完成了数据同步操作。在这个过程中,可能初级程序员开发+同步数据花了一天,有经验的程序员开发+同步数据也花了一天,但是一旦需求一改,数据要重新同步,前者还是需要花费一天,后者则只需要一小时,保证了项目了进度。

讲了上面这个我编出来的非常啰嗦的例子,是想告诉你,初级程序员不使用多线程,可能也能完成需求,但是一定不是最优的,叫做仅仅完成了任务。而项目中其他一定需要使用多线程的地方,可能就懵逼了,你是否知道多线程安全的问题,理解内存模型,以及happens-before原则?

你问:什么样的web应用业务场景需要用到多线程通信,线程阻塞,线程锁?

先说线程锁,不得不说到同步问题,篇幅太长了,我贴一篇我的博客:

浅析项目中的并发 - 常大皮卡丘的专栏 - 博客频道 - CSDN.NET

其次你提到了多线程通信,线程阻塞,这两个我觉得是需要你理解概念,知道工作原理,而并非有很多的实践了,共享内存模型的多线程通信方式,还是使用wait/notify,或者是使用juc中的一些工具,都是需要自己去找文章看的。阻塞这个概念又要理解操作系统的工作模型,不然你写出的代码只是知其然而不知其所以然。

你问: jvm优化是什么,什么样的业务场景又需要优化jvm。到底该如何优化,是优化代码,注意代码的的写法,还是有什么配置文件?

这个能力我规划到了初级的高阶即以上,这是一个初级程序员向中高级程序员进步的必备知识。所以这么多知识当中,这也的确是最难的一点。jvm优化有很多方面,其一便是你说的修改一些参数,扩展tomcat栈内存,配置tomcat的并发线程数...;要搞懂服务器的cpu和内存,与java的什么操作相对应;选择合适的垃圾收集器应对线上的情况等等。另一方面是,线上的服务出了错,莫名其妙的宕机,这可不像本地debug一样方便,需要定位问题,找出原因。这就必须要能dump出线程信息,找到是什么原因导致的内存泄漏,服务器崩溃。各种jvm工具如 Jconsole,jProfile,VisualVM ,都有各自对应的使用场景,我也将他们归类到优化jvm。至于一类专门写java虚拟机代码的人而言(就像R大),jvm又是另外一番理解了,不过一般的程序员没必要关心就是了。题主要还是对JVM疑惑,可以买一本《深入理解java虚拟机》解惑。

你说: 正常情况下一年半的java程序员多少工资合适啊,我也挺努力的,上班不偷懒,好好工作,地铁上看视频学习,回家也经常写代码,但是我没去认真学过多线程和jvm高并发,因为认为自己工作中用不到,所以就没学。

回:工资不是我想跟你讨论的,虽然是必须关心的,因为这是衡量一个程序员价值比较直观的一个因素,自然是和能力相关,工作经验相关。很多人工作了十年,落下十个一年工作经验。北京具体情况我不知道,但是我心里面应届生的待遇如下:初级初阶5k-7k,初级中阶8-10k,初级高阶11k到15k,中阶15-18k,高阶在20k之上,上不封顶。互联网公司,名企,初创公司由于公司性质工作强度问题薪资会有所提升,北上广深由于地域性质薪资会有所提升,工作年限也是如此上述的具体标准都是针对应届生,一张白纸,一年的涨幅算是2k。这么一算,你刚出来1年半,给你加个3k,自己看着自己的水平对号入座吧,不过我并不对我的这个分类负责,这是给你当个参考。后面你提到工作和学习,要想在互联网技术日新月异的如今保持自己的竞争力,就必须如此,如果你是兴趣驱动,那可真是万幸了。

你说:平常学的,java系列框架,前端系列框架,linux,数据库,h5开发app,python,python系列web和爬虫框架

回:不建议如此,从你的情况来看,深度还不够,不如多去研究一下其中的个别东西,如:java系列框架,linux,数据库,因为你真的没有那么多精力。求职java工程师,写上python爬虫经验,不觉得奇怪吗?

高并发是指较多用户同时访问服务。高并发可以由多线程实现,但是多线程不代表就是高并发。
在会计汇有个投票调查项目,是和财政部合作的,会计人员进行填写完调查结果后,将获得5个学分。通过短信向全国500万会计人员发送短信,这时高峰期会有10万多用户同时在线答题。解决办法是:
1、使用了LVS + Nginx四台机器进行负载均衡
2、用了Spring + Redis实现4台Tomcat的Session共享
3、答题页面静态化,
4、用户提交答卷后临时存放在Redis中,直接返回结果。
5、定时器每隔一段时间将Redis数据保存到MySQL

【整理】JavaWeb开发的高并发优化思路(转自CSDN'梁猴子

一、瓶颈分析
用户高并发场景下(几万级别的QPS)
可能出现的瓶颈分析:
    Java虚拟机访问内存:每秒大约1亿次内存读写(不是瓶颈)
    MySQL数据库IO:每秒大约4万次读写(不是瓶颈)
    网络延迟(毫秒级)+JVM的GC产生全局暂停(毫秒级)+MySQL行级锁(可能是瓶颈)

二、多用户对数据库中同一行数据抢占修改
原子计数器(放入Redis缓存:用户名----操作时间)
记录行为(读取Redis缓存,放入分布式MQ消息队列,从队列头部读取最先进入队列的数据:用户A-----操作时间A)
最终修改数据(在MySQL中修改一行数据)

三、优化流程(CDN,Redis,MySQL)
用户流量主要产生在:静态资源、动态资源(频繁变更的数据、不频繁变更的数据)
    (1)对静态资源(JS页面,CSS等静态页面)优化:
                放入CDN(内容分发网络)节点中,CDN部署在离用户最近的网络节点(用户----》城域网)
                一旦命中CDN结点,获取资源后,不再从后端服务器获取。
    (2)对不频繁变更的动态资源(定期更新,由服务器决定更新周期:彩票、天气预报)优化:
                放入Redis(NoSQL)缓存服务器(集群)中,抵抗百万级的QPS
    (3)对频繁变更的动态资源(用户点赞、评论、订单、访问量)
                减少MySQL行级锁持有时间(update同一行数据的语句执行时间尽量短)
                将Java虚拟机服务器的事务管理移植到MySQL服务器上运行(在MySQL上commit/rollback),减少GC、网络时延。
    (4)MySQL优化:分表分库(TDDL框架),读写分离

四、集群化部署
服务端开发主流架构(非微服务)
CDN    WebService:Nginx+Jetty/tomcat    Redis/NoSQL    MySQL

五、人员安排
开发:前后端(前端工程师、后端工程师)
测试:Jmeter等压力测试(测试工程师)
DBA:分表分库、数据库优化(数据库工程师)
运维:服务器日志、服务器运行情况、服务器维护(运维工程师)

Scala快学教程

-
  • 1970年01月01日 08:00

《慢慢学TensorFlow》往期内容回顾

经过一个月加一周,公众号终于有所起色,官方通过了原创声明和后台留言功能审核,谢谢每位读者的支持! 将之前的文章稍微分类整理了一下,方便大家查找: 1.  Ten...
  • dxmkkk
  • dxmkkk
  • 2017-02-17 10:10:46
  • 751

Struts2慢慢学之八----Result

Result也是Struts2比较重要的一部分,在Result的配置中常用的有四种类型:dispatcher、redirect、chain和redirectAction,在这四种中又以前两种最为常见。...
  • meaijojo
  • meaijojo
  • 2012-05-06 10:05:45
  • 985

慢慢地学会了习惯

平时异常忙碌,偶尔有个空闲。想休息,就一个人在公园的角落里晒晒太阳,小睡一会! 每次都是一个人,感觉有点孤单,想找个朋友陪伴,但是电话的那头都是传来忙碌的声音! 慢慢地习惯了,习惯了一个人去看风景,习...
  • fengshuo11
  • fengshuo11
  • 2010-04-28 15:13:00
  • 141

慢慢学,慢慢炼

新空间,慢慢学,慢慢炼
  • ghkuyi
  • ghkuyi
  • 2008-05-08 15:50:00
  • 163

J2ME慢慢学教程

  • 2011年09月09日 17:03
  • 161KB
  • 下载

Unity Shaders and Effects Cookbook (2-1) 修改 UV 坐标实现纹理贴图的滚动 模拟水流效果

昨天加班晚了,困。刚爬起来翻开书学习这一节。这一节是摘抄自Unity Shader and Effect Cookbook 上面的 2.2 节。这书写的简单易懂,每天花一点时间学习一小节,慢慢来。 ...
  • cp790621656
  • cp790621656
  • 2016-03-22 12:24:51
  • 2587

C#记事本源码.rar

  • 2008年12月22日 02:41
  • 59KB
  • 下载

J2ME慢慢学教程.zip

  • 2007年05月16日 14:37
  • 395KB
  • 下载

C#记事本源码

  • 2008年05月12日 18:21
  • 58KB
  • 下载
收藏助手
不良信息举报
您举报文章:慢慢学
举报原因:
原因补充:

(最多只允许输入30个字)