Nginx :今天好累,长时间维持上万个连接,运维也太抠了,就给我这么一台破机器。
Tomcat :Nginx老弟,知道你Nginx的epoll厉害, 但只是“维持连接“,你对这些连接的数据视而不见,一股脑的扔给了我们Tomcat集群,我们才真苦。
Nginx :不要那么绝对,请求的静态文件我是一个不漏的处理掉。
Tomcat :关键就是发过来的动态请求啊,这些请求要访问数据库,缓存,访问MQ,访问微服务,执行业务逻辑,又复杂又要响应快。
Nginx :不对啊,Tomcat的线程池里有几十个线程等着派活干,没有管理好吧。瞧瞧0x9527和0x7954又干起来了。
Tomcat :没资源,没法管。我的机器cpu就4个核,最多只能4个线程并发执行,操作系统大哥负责轮换它们。原因查明,就做一个扣减库存的操作:读取库存,修改库存,写回数据库, 由于线程并发三个操作同时执行了,最后出现了数据不一致的情况。0x9527和0x7954扯皮,因为业务要求在扣减库存之前先检查库存。其实就是操作耗时,阻塞了。
Redis :你俩在吵吵啥呢,Tomcat, 我Redis就单线程处理缓存的读写请求,妥妥的。
Tomcat: 不是吧,单线程 执行这么多缓存的命令?
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密集型的任务如加密,压缩等这类任务,就使用线程池来处理。
Tomcat :Node.js,你继续。
Node.js :人无完人,大部分都是非阻塞的操作,只有少部分才需要线程池的支持。
Tomcat:改成Node.js的处理方式,太费劲,隐患很大。
Vert.x:Tomcat,不用羡慕Node.js,Java 也能实现这种纯粹异步的编程, 我就一直这样的,相安无事。
Tomcat:果然,大Java无所不能啊。
Nginx :大家快动起来,连接暴涨,运维开始测试了。
Redis:快到618了,每次活动,我都要承担无数压力啊。忙起来吧,伙计们。
最新评论
mat插件可以检测内存数据
标识接口?
序列化serializabel就是一个标识
就差一个MAC了
mark
除了预置sql查询字段,其他我竟然都没用过
可以,这个问题遇到过
mybatis多个参数: 1. 注解(最常用) 2. 转化为对象或MAP 3. 按顺序(这个最蠢,写的代码看得费劲) 单个参数需要注意得: 1.基本数据类型随便写 2.数组用array,l