Java 正在API服务器中等待响应

Java 正在API服务器中等待响应,java,sockets,concurrency,akka,netty,Java,Sockets,Concurrency,Akka,Netty,我有一个Netty HTTP服务器,用作API服务器。用户向API服务器发送事件,并使用executor服务或Akka等并发框架在同一服务器的其他线程上处理事件。我有两个选择的回应;当我将事件发送到另一个线程时,我可以等待响应并将其写入套接字,或者只将确认消息写回套接字 当我等待响应时,http请求的延迟增加,服务器可以处理的请求数量减少。另一方面,没有对背压的控制,因此我们不知道服务器何时处理该事件,并且我无法通知用户服务器已处理该事件。但是,服务器可以处理的http请求数量增加,因为几乎所有

我有一个Netty HTTP服务器,用作API服务器。用户向API服务器发送事件,并使用executor服务或Akka等并发框架在同一服务器的其他线程上处理事件。我有两个选择的回应;当我将事件发送到另一个线程时,我可以等待响应并将其写入套接字,或者只将确认消息写回套接字

当我等待响应时,http请求的延迟增加,服务器可以处理的请求数量减少。另一方面,没有对背压的控制,因此我们不知道服务器何时处理该事件,并且我无法通知用户服务器已处理该事件。但是,服务器可以处理的http请求数量增加,因为几乎所有请求的延迟都很低

public void channelRead(ChannelHandlerContext ctx, Object msg) {
    if (msg instanceof HttpRequest) {
        executor.submit(new Event(msg));
        // do not wait for the response
        ctx.write(new DefaultFullHttpResponse(HTTP_1_1, OK));
    }
}

public void channelRead(ChannelHandlerContext ctx, Object msg) {
    if (msg instanceof HttpRequest) {
        Future<Object> future = executor.submit(new Event(msg));
        future.after(x -> ctx.write(new DefaultFullHttpResponse(HTTP_1_1, OK)));
    }
}
public void channelRead(ChannelHandlerContext ctx,Object msg){
if(HttpRequest的消息实例){
执行人提交(新事件(msg));
//不要等待响应
write(新的DefaultFullHttpResponse(HTTP_1_1,OK));
}
}
public void channelRead(ChannelHandlerContext ctx,Object msg){
if(HttpRequest的消息实例){
Future=executor.submit(新事件(msg));
future.after(x->ctx.write(新的DefaultFullHttpResponse(HTTP_1_1,OK));
}
}

由于它是一个API服务器,我不必等待响应来通知用户事件已被处理,因为它只是一个不返回响应的写请求。那么,对于http服务器来说,哪种方式最方便?您认为第二种方式的性能优势值得吗?

我认为答案取决于您的需求。一般来说,一个好的哲学是保持事情简单。这可能意味着完成所需的最小工作量,也可能意味着为扩展留出空间。如果您的用例不返回状态是有意义的,那么您这样做的原因是什么?然而,在简单和提供足够的系统可视性之间通常存在一个折衷。听起来你不确定什么是必需的,什么不是必需的

问自己以下问题:

  • 客户可以使用返回状态来做一些有意义的事情吗?没有此状态,您的客户可以做什么
  • 您能否预见到客户的需求在未来会发生变化,从而要求对后处理进行响应?(即返回状态、返回正文、错误代码等)
  • 您的服务器是否需要跟踪从获取客户端请求到在服务器上将其转化为操作的整个过程
  • 您调试问题的可见性和能力如何
  • 添加功能所需的额外复杂性和开销是什么?这可以接受吗

  • 这些只是在这种情况下你应该问自己的许多问题中的几个。根据您提供的信息,我不确定是否有可能向您提供“您应该做X”或“您应该做Y”的答案。我认为,重新评估您的需求并问自己一些类似上面列出的问题,对您来说是最好的。

    那么问题是什么呢?我更新了问题@biziclop