等待API服务器中的响应

时间:2014-10-26 18:24:59

标签: java sockets concurrency akka netty

我有一台用作API服务器的Netty HTTP服务器。用户将事件发送到API服务器,并使用执行程序服务或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)));
    }
}

由于它是一个API服务器,我不必等待响应,以便通知用户该事件已被处理,因为它只是一个写入请求而不是#39 ; t返回一个回复。那么哪种方式对于http服务器来说是最方便的呢?您认为第二种选择对其性能有何益处?

1 个答案:

答案 0 :(得分:1)

我认为答案取决于您的要求。总的来说,遵循的一个好理念是保持简单。这可能意味着需要进行最少量的工作,这可能意味着为可扩展性留出空间。如果你的用例没有提供状态是有意义的,那么你会这样做的原因是什么?然而,通常在简单和提供对系统的足够可见性之间进行权衡。听起来你不确定是什么和不需要什么?

问自己以下问题:

  1. 客户可以使用返回状态执行有意义的操作吗?没有这种状态,您的客户可以做些什么?
  2. 您是否可以预见客户需求在未来需要更改,以便在处理后要求回复? (即退货状态,退货机构,错误代码等......)
  3. 您的服务器是否需要跟踪从获取客户端请求到将其转换为服务器上的操作所发生的一切?
  4. 您的可见性和调试问题的能力是什么?
  5. 添加功能所需的额外复杂性和开销是多少?这可以接受吗?
  6. 在这种情况下,这些只是你应该问自己的许多问题中的一小部分。根据您提供的信息,我不确定是否可以为您提供&#34;您应该做X&#34;或者&#34;你应该做Y&#34;回答。我认为通过重新评估您的要求并向自己问一些类似上面列出的问题,您将获得最佳服务。