【问题标题】:Business Logic in Netty?Netty 中的业务逻辑?
【发布时间】:2014-06-18 19:06:32
【问题描述】:

我正在开发一个基于 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;
    }
}

【问题讨论】:

    标签: java network-programming netty


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      因此,在处理程序中发出阻塞调用是非常好的。它不会影响其他客户端,只要您不无限期地阻塞它(或至少不会阻塞很长时间),从而不会长时间阻塞 Netty 的线程并且您的服务器实例不会承受过多的负载。

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

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

      【讨论】:

      • 您的第一个解决方案无法扩展:如果您有 100 个客户端同时阻塞调用,您将很快结束,所有线程都锁定在线程池中。(导致每个新连接都等待一个另一个完成)它适用于一个非常小的应用程序,但不适用于普通网站,第一个机器人爬虫将 ddos​​ 你的服务器
      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 2012-02-09
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      相关资源
      最近更新 更多