2014-06-18 39 views
0

我正在开发一个基于Netty libraby的服务器,我在如何构建与业务逻辑有关的应用程序时遇到了问题。Netty中的业务逻辑?

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

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; 
    } 
} 

回答

1

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

pipeline.addLast(new DefaultEventExecutorGroup(50),"BUSSINESS_LOGIC_HANDLER", new BHandler());

ctx.executor().execute(new Runnable() { 
@Override 
public void run() { 
    //Blocking call 
}}); 
0

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

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

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

例如,如果你可以实现WebSocket,那么也许你可以在一个单独的线程中进行阻塞调用,并且当结果可用时,可以通过已经建立的WebSocket将它们推送到客户端。

+0

你的第一个解决方案不能缩放:如果你在阻塞调用时有100个客户端,你将很快结束所有的线程锁定在线程池中(导致每个新的连接完成)它将适用于一个非常小的应用程序,但不适用于一个正常的网站,第一个机器人爬行器将ddos您的服务器 –

+0

诺曼mauer说:http://normanmaurer.me/presentations/2014-facebook-eng-netty/slides.html #23.0 –