Netty构建推送服务问题
Posted Netty之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty构建推送服务问题相关的知识,希望对你有一定的参考价值。
Netty构建推送服务问题
问题:最近在使用Netty构建推送服务的过程中,遇到了一个问题,想再次请教您:如何正确的处理业务逻辑?问题主要来源于阅读您发表在InfoQ上的文章《Netty系列之Netty线程模型》,文中提到 “2.4Netty线程开发最佳实践中 2.4.2复杂和时间不可控业务建议投递到后端业务线程池统一处理。对于此类业务,不建议直接在业务ChannelHandler中启动线程或者线程池处理,建议将不同的业务统一封装成Task,统一投递到后端的业务线程池中进行处理。”
我不太理解“统一投递到后端的业务线程池中进行处理”具体如何操作?像下面这样做是否可行:
private ExecutorService executorService = Executors.newFixedThreadPool(4);
@Override
public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception {
executorService.execute(new Runnable() {
@Override
public void run() {
doSomething();
ctx.writeAndFlush(resp);
}});}
其实我想了解的是真实生产环境中如何将业务逻辑与Netty网络处理部分很好的作隔离,有没有通用的做法?
解答
Netty的ChannelHandler链由I/O线程执行,如果在I/O线程做复杂的业务逻辑操作,可能会导致I/O线程无法及时进行read()或者write()操作。所以,比较通用的做法如下:
1、在ChannelHanlder的Codec中进行编解码,由I/O线程做CodeC;
2、将数据报反序列化成业务Object对象之后,将业务消息封装到Task中,投递到业务线程池中进行处理,I/O线程返回。
错误的做法:
正确的做法
以上是关于Netty构建推送服务问题的主要内容,如果未能解决你的问题,请参考以下文章