Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在类似netty的代理应用程序中管道化请求_Multithreading_Tcp_Netty - Fatal编程技术网

Multithreading 如何在类似netty的代理应用程序中管道化请求

Multithreading 如何在类似netty的代理应用程序中管道化请求,multithreading,tcp,netty,Multithreading,Tcp,Netty,我正在尝试用netty4编写一个类似代理的应用程序,我想知道我是否只能建立一个与一个后端服务器实例连接的通道,而不是每个前端连接一个通道(如netty示例所示) 我有点困惑。基本上,我希望通过管道将即将到来的前端请求从不同的连接传输到我的单个通道到后端服务器。我们知道Channel.write()是线程安全的,这很好。所以我尝试在HttpContentCompressor中使用类似的技术来实现它(它将接受编码头保留在队列中) 可能是这样的: public class Request { Re

我正在尝试用netty4编写一个类似代理的应用程序,我想知道我是否只能建立一个与一个后端服务器实例连接的通道,而不是每个前端连接一个通道(如netty示例所示)

我有点困惑。基本上,我希望通过管道将即将到来的前端请求从不同的连接传输到我的单个通道到后端服务器。我们知道Channel.write()是线程安全的,这很好。所以我尝试在HttpContentCompressor中使用类似的技术来实现它(它将接受编码头保留在队列中)

可能是这样的:

public class Request {
  RequestBody body;
  ChannelHandlerContext frontContext;
}

public class ProxyCodec extends MessageToMessageCodec<Request, ByteBuf> {
  Queue<Request> pendingRequests;
  ...
  protected void encode(ChannelHandlerContext ctx, Request msg, List<Object> out)
        throws Exception {
    pendingRequest.add(msg);
    out.add(myEncoder.encode(msg.getBody()));
  }

  protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out)
        throws Exception {
    Request pendingRequest = pendingRequests.poll();
    pendingRequest.getFrontContext().writeAndFlush(myDecoder.decode(msg));
  }
}
公共类请求{
请求主体;
ChannelHandlerContext-frontContext;
}
公共类ProxyCodec扩展MessageToMessageCodec{
排队等待请求;
...
受保护的无效编码(ChannelHandlerContext ctx、请求消息、列表输出)
抛出异常{
pendingRequest.add(msg);
add(myEncoder.encode(msg.getBody());
}
受保护的无效解码(ChannelHandlerContext ctx、ByteBuf msg、列表输出)
抛出异常{
Request pendingRequest=pendingRequests.poll();
pendingRequest.getFrontContext().writeAndFlush(myDecoder.decode(msg));
}
}
因此,我们将这个ProxyCodec放入后端通道管道,并通过它写入所有请求,然后期望它将响应发送到正确的前端上下文

但我不确定它是否有效。pendingRequests队列应该是线程安全的吗?通过此处理程序的请求在写入后端服务器时是否保持相同的顺序

或者有什么更好的办法来实现这一点

谢谢


更新:


似乎出站处理程序可以由非IO线程并发调用。要解决这个问题,,在我的前端/后端通道之间添加一个多生产者单消费者队列,这样只有单消费者线程才会调用ProxyCodec,这是一个好主意吗?

不,在Netty 4中,它不能是线程安全的,因为所有这些都将由分配给保存ProxyCodec的通道ChannelPipeline的EventLoop处理是否与入/出绑定通道共享相同的eventLoop?