课件和 Demo 地址
https://gitee.com/geektime-geekbang/geek_netty
作者回复: 估计这个关闭复杂的你都怀疑关闭有那么简单么?问的我不禁回头翻了下dubbo/hadoop和做过的项目的代码了,还好都是下面2句话: bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); 所以放心使用吧!
作者回复: 谢谢肯定,就是普通话不标准......
作者回复: 给你举2个例子啊: 1 比如请求刚建立的时候,那个建立的请求,不是要register么,例如注册读事件?那个register就是一个task。 2 你的业务如果不独立出一个线程池来处理,你不就复用IO线程了么?那你的业务处理这个事情就封装成task了 3 其他所有的handler,类似第二点,只要和io复用在一起,那就成一个task来执行了。所以才有了io和普通的task的比例ioratio一说。
作者回复: 说是优雅关闭,其实不是说长连接关闭优雅,而是在关闭时,对正在处理请求的优雅。 现在很多不都是蓝绿部署么?部署之前先把流量切走,这样只要优雅处理当前的剩余请求就可以了,所以一方面你可以把关闭的时间调大点,还是不放心的话,可以做一个功能,就是能实时查看还有多少请求还在处理,如果没有了,再升级。 另外一个方面你可以看看这个业务本身的可靠性要求等等,实际上,假设你就把某个请求丢了,你的客户端一般都会做重试,等于自动补偿了。
作者回复: 是的,现在我还是迷惘的,哈哈,不过好在,我发现netty的那些创始人也不是都懂,一起阿Q了一下。
作者回复: 不容易,哈哈,加油!
作者回复: 肯定不能ctrl+c,不然你不就要有产线环境的权限了么,而且那么多机器怎么操作尼。 不定要配合Runtime.getRuntime().addShutdownHook(),一般使用netty都是做一个核心服务,自然要主动关闭,而不是等着jvm关闭的时候再关,所以直接调用shutdown方法就行了。
作者回复: 这个问题本身和netty没有关系,讨论的是java程序的优美关闭问题了。这 两个一般都是放一起用的,信号是为了触发你来关,hook是让关闭的时候别忘记清理,所以一般都是配合,所以可以置换成别的方式,比如假设你是http服务器,你可以不用信号量而直接用http api调用来触发关闭,例如jennkins: http://<jenkins.server>/safeExit
作者回复: 只能说太狠了,😂
作者回复: 是的,channel关闭了,这块逻辑也挺乱的,而且经过几次改变,连维护者的那些人也迷糊的很,大体思路就是不保证所有请求了,不然时间无法保证,当然也会尽量。所以不要依赖它的行为,而是指望客户端自己去重试什么的。