Java Netty中的业务逻辑?

Java Netty中的业务逻辑?,java,network-programming,netty,Java,Network Programming,Netty,我正在开发一个基于Netty libraby的服务器,在如何根据业务逻辑构建应用程序方面遇到了问题 当前,我在最后一个处理程序中有业务逻辑,这就是我访问数据库的地方。我无法理解的是访问数据库的延迟(阻塞代码)。建议在处理程序中执行此操作,还是有其他替代方法?代码如下: public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { super.channelRead(ctx

我正在开发一个基于Netty libraby的服务器,在如何根据业务逻辑构建应用程序方面遇到了问题

当前,我在最后一个处理程序中有业务逻辑,这就是我访问数据库的地方。我无法理解的是访问数据库的延迟(阻塞代码)。建议在处理程序中执行此操作,还是有其他替代方法?代码如下:

public void channelRead(ChannelHandlerContext ctx, Object msg)
        throws Exception {
    super.channelRead(ctx, msg);
    Msg message = (Msg)msg;
    switch(message.messageType){
        case MType.SIGN_UP:
            userReg.signUp(message.user);// blocking database access
            break;
    }
}

您应该在
DefaultEventExecutorGroup
中执行阻塞调用,或者在添加处理程序时可以添加到自定义线程池中

pipeline.addLast(新的DefaultEventExecutorGroup(50),“业务逻辑处理程序”,新的BHandler())


每次服务器接收到请求时,您的自定义处理程序都由Netty初始化,因此处理程序的一个实例负责处理一个客户端

因此,在处理程序中发出阻塞调用是完全正确的。它不会影响其他客户端,只要您不无限期地(或者至少不会很长时间)阻止它,从而不会长时间阻止Netty的线程,并且不会在服务器实例上获得太多负载

但是,如果您想采用异步设计,那么可以使用多种设计模式


例如,使用Netty,如果您可以实现WebSocket,那么您可能可以在单独的线程中进行阻塞调用,当结果可用时,您可以通过已经建立的WebSocket将它们推送到客户端

你的第一个解决方案不可扩展:如果你同时有100个客户端进行阻塞调用,那么你很快就会结束,所有线程都锁定在线程池中。(导致每个新的连接都需要相互连接才能完成)它适用于非常小的应用程序,但不适用于普通的网站,第一个机器人爬虫将对您的服务器进行ddos攻击Norman mauer说:
ctx.executor().execute(new Runnable() {
@Override
public void run() {
    //Blocking call
}});