记录折腾的那点事
在折腾的道路上永不止步

Nginx,Redis,Node.js,Tomcat,Vert.x一起讨论大流量高并发

Nginx :今天好累,长时间维持上万个连接,运维也太抠了,就给我这么一台破机器。

Tomcat :Nginx老弟,知道你Nginx的epoll厉害, 但只是“维持连接“,你对这些连接的数据视而不见,一股脑的扔给了我们Tomcat集群,我们才真苦。

618来临Nginx,Redis,Node.js,Tomcat,Vert.x一起讨论大流量高并发

Nginx把链接转给Tomact集群

Nginx :不要那么绝对,请求的静态文件我是一个不漏的处理掉。

Tomcat :关键就是发过来的动态请求啊,这些请求要访问数据库,缓存,访问MQ,访问微服务,执行业务逻辑,又复杂又要响应快。

Nginx :不对啊,Tomcat的线程池里有几十个线程等着派活干,没有管理好吧。瞧瞧0x9527和0x7954又干起来了。

618来临Nginx,Redis,Node.js,Tomcat,Vert.x一起讨论大流量高并发

0x9527和0x7954同时处理任务

Tomcat :没资源,没法管。我的机器cpu就4个核,最多只能4个线程并发执行,操作系统大哥负责轮换它们。原因查明,就做一个扣减库存的操作:读取库存,修改库存,写回数据库, 由于线程并发三个操作同时执行了,最后出现了数据不一致的情况。0x9527和0x7954扯皮,因为业务要求在扣减库存之前先检查库存。其实就是操作耗时,阻塞了。

Redis :你俩在吵吵啥呢,Tomcat, 我Redis就单线程处理缓存的读写请求,妥妥的。

Tomcat: 不是吧,单线程 执行这么多缓存的命令?

Redis :就是一个接一个的执行任务就可以了。单线程还有个好处,不用对内存数据加锁。

618来临Nginx,Redis,Node.js,Tomcat,Vert.x一起讨论大流量高并发

redis单线程输入输出

Tomcat:真是羡慕嫉妒恨,我这里多线程稍有不注意就死锁,头发都急白。

Nginx:Tomcat老兄,你也可以学习Redis,干掉3个,只留一个线程,把资源都给它。

Tomcat :你这是挖坑啊。Redis是内存操作,最多100纳秒就处理完了,多快啊。我Tomcat的处理的任务都是文件,数据,网络这些IO操作,需要几十到几百毫秒时间不等。 要按Redis的处理方式,那就集体歇菜。本质就是因为任务太耗时,阻塞。还得用多线程来处理!

Node.js:听你们讨论这么久了。Tomcat,任务太耗时,可以用单线程异步处理的方式。

Tomcat :我用的超级线程,0x7954遇到访问数据库的任务,很耗时。Node.js分享下如何单线程异步?

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

Tomcat:有点道理,一个线程就可以完成了,还不用等待!

Node.js:是的,Node.js中这叫“单线程,非阻塞IO,事件循环”

Tomcat :哎,异步单线程要求所有的I/O操作都必须是非阻塞的,如果有一个不是,那不是不能继续干货了。

Node.js:Tomcat想得全面,Node.js会用很多方法来使用非阻塞方式处理所有的I/O 。像Linux文件I/O,DNS,CPU密集型的任务如加密,压缩等这类任务,就使用线程池来处理。

618来临Nginx,Redis,Node.js,Tomcat,Vert.x一起讨论大流量高并发

Node.js任务处理过程

Tomcat :Node.js,你继续。

Node.js :人无完人,大部分都是非阻塞的操作,只有少部分才需要线程池的支持。

Tomcat:改成Node.js的处理方式,太费劲,隐患很大。

Vert.x:Tomcat,不用羡慕Node.js,Java 也能实现这种纯粹异步的编程, 我就一直这样的,相安无事。

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

Nginx :大家快动起来,连接暴涨,运维开始测试了。

Redis:快到618了,每次活动,我都要承担无数压力啊。忙起来吧,伙计们。

赞(0)
未经允许不得转载:ghMa » Nginx,Redis,Node.js,Tomcat,Vert.x一起讨论大流量高并发
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址