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构建推送服务问题的主要内容,如果未能解决你的问题,请参考以下文章

Netty系列之Netty百万级推送服务设计要点

Netty百万级推送服务设计要点

Netty系列Netty百万级推送服务设计要点

Netty系列之Netty百万级推送服务设计要点

在netty中使用websocket进行服务器推送[关闭]

IOS推送http2使用netty服务启动异常