如何在类似代理的netty应用程序中传递请求

时间:2014-04-27 08:43:57

标签: multithreading tcp netty

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

这让我很困惑。基本上我想将来自不同连接的即将到来的前端请求传递到我的单通道到后端服务器。我们知道Channel.write()是线程安全的,这很好。所以我试图用HttpContentCompressor中的类似技术来处理它(它将Accept-Encoding头保留在队列中)。

它会是这样的:

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

所以我们将这个ProxyCodec放到我们的后端通道管道中,并通过它写入所有请求,然后期望它会将响应分派给正确的前端上下文。

虽然我不确定它是否会起作用。 pendingRequests队列应该是线程安全的吗?请求通过此处理程序保持与写入后端服务器相同的顺序吗?

还是有任何更好的想法来实现这个目标?

由于


更新

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

1 个答案:

答案 0 :(得分:0)

不,它不能在Netty 4中是线程安全的,因为所有都将由分配给ChannelPipeline持有ProxyCodec的Channel的EventLoop处理