查看原文
其他

软件巨头卧谈会

码农翻身刘欣 码农翻身 2021-04-27

深夜时分,忙碌了一天的机房里逐渐安静下来,几个软件巨头nginx, Tomcat, Redis, Node.js又开始夜谈了。 


nginx伸了一个懒腰:哎哟,今天可累死我了,高峰期我居然维持了上万个连接,人类可真会压榨我啊,就给我这么一台破机器! 


Tomcat :得了吧老弟,我知道你用的epoll很厉害, 但是你只是“维持”了连接而已,通过这些连接发过来的数据请求,你一个都不管,都分给我们Tomcat集群了,我们才是真苦逼啊!



nginx:谁说的?那些对静态文件的请求我不都处理了吗?都没往你那里发。 


Tomcat :处理个静态文件算啥!关键是用户发过来的动态请求,需要访问数据库,访问缓存,访问MQ,访问微服务,执行业务逻辑,这才是要命的东西!


nginx觉得被Tomcat打击到了,立刻反击:我看了一下,你线程池里有几十个线程仆人给你干活,是你管理不善吧, 你看看0x7954,  向数据库发了个SQL就坐在那里喝茶了。还有0x6904,刚才访问了一下微服务,这躺在那里睡半天了, 你也不管管。 



Tomcat :唉,我也没法管啊,他们俩停下里休息,还不是遇到了耗时的操作?阻塞住了!不等着怎么办?还有啊, 我的机器CPU只有4个核心,同一时刻只能有4个线程仆人能执行,操作系统老大要对他们做轮换, 总得有人歇着, 要是有100个CPU核心就好了。 


Redis :别做梦了,怎么可能有100个核心 !  Tomcat 兄, 你看看我这里只有一个线程仆人在处理对缓存的读写请求,不也干得好好的, 你瞧瞧我这个仆人是怎么干活的,多勤快!


Tomcat大为吃惊: 哦? 你只有一个仆人?  执行这么多缓存的命令!你这个仆人是超人啊!


Redis :超人谈不上,他只要挨个执行任务就可以了。单线程还有个额外的好处,不用对内存的数据加锁。


Tomcat:真是让我羡慕啊,我这里多线程弄不好就出现死锁,头疼。


Nginx 笑道:Tomcat老兄,你可以仿照Redis的方式来,把那些线程懒仆人都开除了,只留一个,你给他多发三倍工资,他也会变成超人的。


Tomcat动心了,不过他思考了一会儿,发现了问题的本质


Tomcat :不对,不对, 你们俩这是给我挖坑。Redis的那些任务都是内存操作,内存的访问多快啊,100纳秒左右就行了,我Tomcat处理的任务都是文件,数据,网络这些操作,需要10到几百毫秒。  我要是按照Redis的路数,就会变成这样了: 



Tomcat :看到了吧,0x7954还得歇着喝茶。本质就是任务太耗时,阻塞住了, 还得用多个线程来处理!


Node.js 半天没吭声,这时候跳了出 :Tomcat兄,此言差矣, 任务太耗时,也可以用单线程啊!你把它搞成异步的不就行了! 


Tomcat : 异步?怎么异步?我的超级线程0x7954遇到了访问数据库的任务,很耗时,他不歇着还能怎么办? 


Node.js:简单啊,执行下一个任务!但是,在执行之前,要给0x7954安插一个回调函数,等到数据库返回数据了,通知0x7954执行这个回调函数,处理返回数据不就行了!


Tomcat :听起来不错啊,一个线程就把所有的事情做完了,还不用歇着 ! 


Node.js:是啊是啊,我一直就是这么干的,这就叫“单线程,非阻塞IO,事件循环”


Tomcat很羡慕这种方式,他又思考了一会儿,发现了问题。


Tomcat : 不对啊,如果想用单线程,那所有的I/O操作都必须是非阻塞的,如果有一个不是,那我唯一的仆人就没法去干别的事情了。


Node.js:嘿嘿,Tomcat兄台还是挺厉害的嘛,我会尽最大的努力使用非阻塞的方式来处理所有的I/O ,对于那些实在搞不定的 ,比如Linux文件I/O,DNS,CPU密集型的任务如加密,压缩等,嘿嘿,我就用个线程池! 


Tomcat :说来说去,又回到了线程池!


Node.js :嘿嘿,没有完美的事物嘛, 大部分都是非阻塞的操作,只有少部分才需要线程池的支持。 


Tomcat 叹了口气:唉!我要是想改成你这样,还挺费劲的。


Vert.x :Tomcat兄,不用羡慕Node.js, 咱们Java 也能实现这种纯粹异步的编程, 你看看我,不就是这样吗?码农翻身的这篇文章已经说得很清楚了:《Java能抵挡住JavaScript的进攻吗?


Tomcat :果然,我大Java无所不能啊,哈哈。


突然间,系统的流量暴增


Nginx :怎么回事?大半夜的,怎么突然来了这多连接? 


Redis:惨了惨了,临近618, 估计人类搞了什么活动,每次搞活动,我这里都压力山大,兄弟们,别聊了,忙起来吧!




宇宙第一IDE到底是谁?

Node.js :我只需要一个店小二

HTTP Server :一个差生的逆袭

我要穿越,干翻“烂语言”JavaScript

如何降低程序员的工资?

程序员,你得选准跑路的时间!

两年,我学会了所有的编程语言!

一直CRUD,一直996,我烦透了,我要转型

字节码万岁!

上帝托梦给我说:一切皆文件

Javascript: 一个屌丝的逆袭

我是一个线程

TCP/IP之大明邮差

一个故事讲完Https

CPU 阿甘

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存